J'ai une liste comme suit.

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

Je souhaite créer la person-item liste à partir de mylist comme suit.

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"]]]]

C'est comme ça que je fais actuellement.

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)

Cependant, cela est très inefficace car j'ai un énorme ensemble de données à traiter. En d'autres termes, mon programme actuel est O (n) et O (n2). Je cherche des moyens de le faire efficacement en python.

Je suis heureux de fournir plus de détails si nécessaire.

1
EmJ 8 avril 2020 à 14:45

3 réponses

Meilleure réponse

Vous pouvez utiliser un dict pour ajouter la liste à la clé qui est la personne, ce serait plus efficace que de collecter les valeurs précédentes à chaque fois. Avec defaultdict si la clé n'est pas présente, elle sera ajoutée avec le type que vous avez spécifié, ici un list, puis ajoutez-y simplement votre liste

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

Cela donne

{'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']]}

Pour revenir à votre structure si vous en avez vraiment besoin:

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']]]]
3
azro 8 avril 2020 à 11:54

Vous pouvez utiliser dict.setdefault pour initialiser chaque personne avec une liste vide et continuer à ajouter des listes entrantes aux personnes respectives:

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

Pour que:

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

Retour:

[['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']]]]
1
blhsing 8 avril 2020 à 11:58
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)

Tirages:

['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']]]
1
Booboo 8 avril 2020 à 12:01