我有一个列表,如下所示。
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']]]