如何在python中有效地对列表进行分类



我有一个列表,如下所示。

mylist = [["person1,person2,person3", ["item1", "item2", "item3", "item4", "item5", "item6"]], 
["person4,person5,person3", ["item10", "item11", "item12"]]]

我想从mylist制作person-item列表,如下所示。

myoutput = [["person1", [["item1", "item2", "item3", "item4", "item5", "item6"]]],
["person2", [["item1", "item2", "item3", "item4", "item5", "item6"]]],
["person3", [["item1", "item2", "item3", "item4", "item5", "item6"], ["item10", "item11", "item12"]]], 
["person4", [["item10", "item11", "item12"]]]
["person5", [["item10", "item11", "item12"]]]]

这就是我目前的做法。

mylist = [["person1,person2,person3", ["item1", "item2", "item3", "item4", "item5", "item6"]], ["person4,person5,person3", ["item10", "item11", "item12"]]]
person_list = []
for item in mylist:
person_list.extend(item[0].split(","))
person_list = list(set(person_list))
print(person_list)
myoutput = []
for person in person_list:
mytemp = []
for item in mylist:
if person in item[0]:
mytemp.append(item[1])
myoutput.append(tuple((person, mytemp)))
print(myoutput)

然而,这是非常低效的,因为我有一个巨大的数据集要处理。换句话说,我当前的程序是O(n(和O(n2(。我正在寻找在python中有效地做到这一点的方法。

如果需要,我很乐意提供更多细节。

您可以使用dict将列表添加到作为人员的键中,这将比每次收集以前的值更有效。使用defaultdict,如果密钥不存在,它会将其添加到您指定的类型,这里是list,然后将您的列表添加到

myoutput = defaultdict(list) # from collections import defaultdict
for item in mylist:
for person in item[0].split(","):
myoutput[person].append(item[1])

这提供

{'person1': [['item1', 'item2', 'item3', 'item4', 'item5', 'item6']], 
'person2': [['item1', 'item2', 'item3', 'item4', 'item5', 'item6']], 
'person3': [['item1', 'item2', 'item3', 'item4', 'item5', 'item6'], ['item10', 'item11', 'item12']], 
'person4': [['item10', 'item11', 'item12']], 'person5': [['item10', 'item11', 'item12']]}

如果你真的需要,回到你的结构:

myoutput = [[k, v] for k, v in myoutput.items()]
[['person1', [['item1', 'item2', 'item3', 'item4', 'item5', 'item6']]], 
['person2', [['item1', 'item2', 'item3', 'item4', 'item5', 'item6']]], 
['person3', [['item1', 'item2', 'item3', 'item4', 'item5', 'item6'], ['item10', 'item11', 'item12']]], 
['person4', [['item10', 'item11', 'item12']]], ['person5', [['item10', 'item11', 'item12']]]]

您可以使用dict.setdefault用一个空列表初始化每个人,并不断将传入列表附加到相应的人:

output = {}
for persons, items in mylist:
for person in persons.split(','):
output.setdefault(person, []).append(items)

因此:

list(map(list, output.items()))

退货:

[['person1', [['item1', 'item2', 'item3', 'item4', 'item5', 'item6']]],
['person2', [['item1', 'item2', 'item3', 'item4', 'item5', 'item6']]],
['person3',
[['item1', 'item2', 'item3', 'item4', 'item5', 'item6'],
['item10', 'item11', 'item12']]],
['person4', [['item10', 'item11', 'item12']]],
['person5', [['item10', 'item11', 'item12']]]]
from collections import defaultdict
mylist = [["person1,person2,person3", ["item1", "item2", "item3", "item4", "item5", "item6"]],
["person4,person5,person3", ["item10", "item11", "item12"]]]
d = defaultdict(list)
for item in mylist:
for name in item[0].split(','):
d[name].append(item[1])
l = [[k, v] for k, v in d.items()]
for item in l:
print(item)

打印:

['person1', [['item1', 'item2', 'item3', 'item4', 'item5', 'item6']]]
['person2', [['item1', 'item2', 'item3', 'item4', 'item5', 'item6']]]
['person3', [['item1', 'item2', 'item3', 'item4', 'item5', 'item6'], ['item10', 'item11', 'item12']]]
['person4', [['item10', 'item11', 'item12']]]
['person5', [['item10', 'item11', 'item12']]]

最新更新