Как объединить объекты в списке на основе предыдущего объекта? - PullRequest
2 голосов
/ 25 октября 2019

У меня есть список упорядоченных подсписков, который содержит два строковых объекта.

mylist = [['x1','red'],['x2','blue'],['x2','green'],['x1','yellow']]

Я пытаюсь найти способ инициировать следующее правило:

for sublist in mylist:
    if sublist[0] == sublist[0] - 1
        combine sublist and sublist - 1

Другими словами, мне нужно, чтобы первая строка в каждом подсписке была проверена по первому стригу в предыдущем подсписке, и совпадают ли эти два, чтобы объединить их;в результате получается следующее:

mySortedlist = [['x1','red'],['x2','blue','x2','green'],['x1','yellow']]

Примечание. Меня интересует только предшествующий подсписок, а не то, появился ли элемент в другом месте списка.

Обновление: основываясь на полезном комментарии другого пользователя, стоит отметить, что мой фактический файл данных состоит из многих тысяч строк текста, из которых эти аномалии могут появиться где угодно.

Ответы [ 3 ]

3 голосов
/ 25 октября 2019

Вы можете использовать itertools.groupby, чтобы найти последовательные элементы:

from itertools import chain, groupby
from operator import itemgetter

[[*chain.from_iterable(v)] for _,v in groupby(mylist, key=itemgetter(0))]
# [['x1', 'red'], ['x2', 'blue', 'x2', 'green'], ['x1', 'yellow']]
2 голосов
/ 25 октября 2019

Вы можете сделать это так:

from itertools import groupby

mylist = [['x1','red'],['x2','blue'],['x2','green'],['x1','yellow']]

[[j for i in v for j in i] for k, v in groupby(mylist, key=lambda x: x[0])]

#[['x1', 'red'], ['x2', 'blue', 'x2', 'green'], ['x1', 'yellow']]
0 голосов
/ 25 октября 2019

Я только что написал короткую вещь. Это не слишком сложно, если вы просто отступите назад и подумаете о том, как «if sublist [0] == sublist [0] - 1» будет выглядеть в реальном коде. Один камень преткновения, вероятно, является блоком «попробовать-исключить», чтобы справиться с первым элементом в списке (первый элемент вызовет ошибку «Индекс вне диапазона»)

mylist = [['x1','red'],['x2','blue'],['x2','green'],['x1','yellow']]

mylist2 = []
for sublist in mylist:
    print(sublist)
    print(mylist2)
    try:
        if sublist[0] == mylist2[-1][0]:
            mylist2[-1].append(sublist[0])
            mylist2[-1].append(sublist[1])             
        else:
            mylist2.append(sublist)
    except Exception as e:
        if len(mylist2) == 0:
            mylist2.append(sublist)
        else:
            raise e

print(mylist2)

->

['x1', 'red']
[]
['x2', 'blue']
[['x1', 'red']]
['x2', 'green']
[['x1', 'red'], ['x2', 'blue']]
['x1', 'yellow']
[['x1', 'red'], ['x2', 'blue', 'x2', 'green']]
[['x1', 'red'], ['x2', 'blue', 'x2', 'green'], ['x1', 'yellow']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...