Сортировать данные из n списков в хронологическом порядке

У меня есть несколько списков данных следующим образом:

fechas = [datetime1, datetime2, datetime3, ....]
operaciones = ['GA', 'GA', 'PA', ...]

Список операций - это набор строк, который отсортирован в хронологическом порядке и соответствует элементам списка дат, который представляет собой набор объектов. datetime, это означает, что элемент operaciones[0] соответствует дате fechas[0], у меня есть несколько файлов с обоими списками, которые соответствуют различным измерениям.

Моя проблема заключается в следующем: я хотел бы создать один список с элементами всех списков, отсортированных в хронологическом порядке, но, честно говоря, я не очень хорошо знаю, как это сделать, у меня есть две идеи, но я не знаю, как их реализовать, например, у меня есть 12 списки (6 операций 6 дат) мне приходит в голову сравнить первый элемент каждого списка дат, и когда я нахожу второстепенную вставку в новом списке элемент, соответствующий этой дате списка операций, НО 6 сравнений потребуют от меня много кода и очень низкая эффективность, у меня другая идея, что было бы лучше использовать словари вместо списков одного словаря таким образом: diccionario = {datetime1: 'GA', datetime2: 'GA', datetime3: 'PA'} это означало бы наличие 6 словарей (отсортированных в порядке возрастания) вместо 12 списков, чтобы получить словарь или список Со всеми операциями вам просто нужно добавить все элементы независимо от порядка, а затем упорядочить их в соответствии с ключом, который является объектом datetime (операция ионы с датами) но тут у меня есть некоторые сомнения: как вы заказываете словарь? в случае повторения какой-либо даты какого-либо файла, как бы я его закажу?

Надеюсь, вы мне поможете.

0
задан 18.01.2017, 22:31
0 ответов

Если есть возможность того, чтобы дата повторилась, использовать словари осложняется, так как ключ словаря всегда единственный. Возможно способствовать тому, чтобы стоимость словаря была списком, и добавлять в каждый key (дату) все string, которые совпадают с этой датой.

Я думаю, что он состоит в том, чтобы осложняться немного, ты смог бы прилагать просто списки и потом упорядочивать. Для того, чтобы он был работоспособнее, вместо того, чтобы создавать два огромных списка, произошедший от того, что прилагать все даты и все операции, ты можешь использовать itertools.chain который создает iterador.

Чтобы предоставлять пример я буду создавать три пары готовой даты - операции. Чтобы создавать ты заносишь в список ее объектов datetime я использовал, как базовый настоящая дата и потом я уменьшаю его в дни, чтобы создавать различные даты только подобно примеру.

import datetime
import itertools

base = datetime.datetime.today()


fechas1 = [base-datetime.timedelta(days=1), base-datetime.timedelta(days=3), base-datetime.timedelta(days=5)]
operaciones1 = ['S1', 'S2', 'S3']

fechas2 = [base-datetime.timedelta(days=2), base-datetime.timedelta(days=6), base-datetime.timedelta(days=8)]
operaciones2 = ['S4', 'S5', 'S6']

fechas3 = [base-datetime.timedelta(days=5), base-datetime.timedelta(days=7), base-datetime.timedelta(days=8)]
operaciones3 = ['S7', 'S8', 'S9']


fechas = itertools.chain(fechas1, fechas2, fechas3)
operaciones = itertools.chain(operaciones1, operaciones2, operaciones3)
ordenadas = [op for fecha, op in sorted(zip(fechas, operaciones))]

print(ordenadas)

Возвратись:

['S6', 'S9', 'S8', 'S5', 'S3', 'S7', 'S2', 'S4', 'S1']

Это дает нам, как он может, повернул список всех операций, упорядоченных согласно Вашим спискам fechas корреспонденты. Порядок - более старой (индекс 0) в более недавний.

2
ответ дан 03.12.2019, 17:37

Решение, которое дало тебе @FJSevilla, было бы общим решением. Хотя он использует iteradores, чтобы избавлять от ресурсов, еще нуждайся в том, чтобы загрузить все данные в памяти, чтобы делать распорядок.

Понимая, что данные уже упорядочены cronológicamente в Ваших соответствующих списках, существует гораздо более работоспособное решение, и минимальная цена, чтобы перемешивать их: батарейки первенства (heapq).

Давайте предполагать, что у нас есть списки операций и Ваши готовые корреспонденты дат. Мы можем создавать батарейку первенства следующей формы:

import heapq

iter_operaciones = [
    zip(fechas1, operaciones1),
    zip(fechas2, operaciones2),
    zip(fechas3, operaciones3),
]
h = heapq.merge(*iter_operaciones)

Чтобы обрабатывать эту батарейку, или он проходит в список (list(h)) или он используется for как с любым iterador:

for (fecha, op) in h:
    print("{:%Y-%m-%d}: {}".format(fecha, op))

Есть иметь в виду, что не верят ни в какой промежуточный список, так как читается информация каждого iterador по мере того, как он был надо. Даже было бы возможно читать прямо данные с каждого файла к диску, не переворачивая полного файла в память, а следовательно было бы возможно обрабатывать огромное количество данных, не растрачивая ресурсов.

Например, давайте предполагать, что операции находятся в файлах текста вместо списка, операцию из-за линии текста. Код был бы очень похожим:

import heapq

with open("operaciones1.txt") as f1,
     open("operaciones2.txt") as f2,
     open("operaciones3.txt") as f3:

  iter_operaciones = [
    zip(fechas1, f1),
    zip(fechas2, f2),
    zip(fechas3, f3),
  ]
  h = heapq.merge(*iter_operaciones)

  for (fecha, op) in h:
      print("{:%Y-%m-%d}: {}".format(fecha, op))
2
ответ дан 03.12.2019, 17:37

Теги

Похожие вопросы