Давайте начнем с использования словаря, чтобы сопоставить элементы со списком значений. Это будет намного проще (и быстрее), чем список, потому что выяснить, какой список добавить новое значение, это просто mydict[item]
вместо того, чтобы писать какую-то функцию линейного поиска.
mydict = {}
for item, otherstuff, value in mylist:
mydict.setdefault(item, []).append(value)
Это дает:
{'item1': ['value1', 'value2'], 'item2': ['value3', 'value4']}
Теперь мы можем преобразовать этот словарь обратно в список, если вы хотите:
groupedlist = [[k] + v for k, v in mydict.items()]
Это дает:
[['item2', 'value3', 'value4'], ['item1', 'value1', 'value2']]
Большой недостаток здесь заключается в том, что как только вы вставляете вещи в диктофон, вы теряете любой первоначальный порядок. Если вы ожидали, что item1
будет первым, потому что его первая запись была сделана до первой записи item2
(или потому, что последняя запись item2
появилась после item1
, может быть?), Вы потеряли это. Если это важно, вы можете использовать OrderedDict
.
Большой потенциал - это то, что часто вам нужен словарь в конце, а не список.
Меньший потенциал роста заключается в том, что если ваши данные не отсортированы, groupby(…sorted(…))
требует сортировку O (NlogN), тогда как это решение равно O (N). Обычно это не изменит ситуацию. И если это произойдет, различия в постоянном коэффициенте для данной реализации и платформы Python могут перевесить различия в любом случае. Но если производительность важна, проверьте оба решения и используйте более быстрый.
Большое спасибо, это было невероятно полезно. – user2236076