фильтрация списка списков, содержащих кортежи - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть следующий пример:

tuples = [[('2018','Q1','Dept1'),('2018','Q2','Dept2')],[('2018','Q1','Dept1'),('2018','Q1','Dept2')],[('2018','Q2','Dept1'),('2018','Q2','Dept2')]]

поэтому каждый элемент в кортежах представляет собой список из 2 элементов, каждый из которых представляет собой кортеж из 3 элементов.

я хочу создать окончательный список, newlist, который фильтруется в соответствии с первыми 2 значениями каждого кортежа в каждом списке, эквивалентными

Итак, в этом примере я ожидал бы, что newlist будет выглядеть так:

[[('2018', 'Q1', 'Dept1'), ('2018', 'Q1', 'Dept2')],
 [('2018', 'Q2', 'Dept1'), ('2018', 'Q2', 'Dept2')]]

это упрощенный пример, тогда как реальный размер tuples может быть намного больше

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Сначала я бы сделал словарь на основе первых двух элементов:

entries = {}
for tuple in tuples:
    key = tuple[:2]
    entries[key] = entries.get(key, []) + [tuple[2]]

Тогда вы можете восстановить свой новый список

newlist = []
for entry, values in entries.items():
    sublist = []
    for val in values:
        sublist.append(entries + (val,))
    newlist.append(sublist)
0 голосов
/ 07 сентября 2018

Попробуйте приведенное ниже, повторяясь через tuples, затем проверьте, совпадают ли первые два элемента первого элемента i со вторым элементом:

>>> [i for i in tuples if i[0][:2]==i[1][:2]]
[[('2018', 'Q1', 'Dept1'), ('2018', 'Q1', 'Dept2')], [('2018', 'Q2', 'Dept1'), ('2018', 'Q2', 'Dept2')]]
>>> 

Или курс, который вы также можете использовать filter:

>>> list(filter(lambda i: i[0][:2]==i[1][:2]],tuples))
[[('2018', 'Q1', 'Dept1'), ('2018', 'Q1', 'Dept2')], [('2018', 'Q2', 'Dept1'), ('2018', 'Q2', 'Dept2')]]
>>> 
...