2017-09-26 1 views
1

Désolé que je dois poser cette question si elle est un peu facile, comme peu de temps pour ce script..I've déjà écrit certains codes comme ci-dessous:Comment combiner plus d'une liste en plus d'un dicts en utilisant python?

localNames = re.findall(r"<\*\[local-name\(\)='.*?'.*?\/@\*\[name\(\)='.*?'.*?'\]", str(nontransTagsContent[0])) 
for i in localNames: 
tags = re.findall(r"local-name\(\)='(.*?)'", i) 
attributes = re.findall(r"name\(\)='(.*?)'", i) 

Et le résultat pour print(tags) est ci-dessous:

['tag1'] 
['tag2', 'tag3', 'tag4'] 
['tag5', 'tag6'] 

Le résultat pour print(attributes) est ci-dessous:

['attribute1', 'attribute2', 'attribute3', 'attribute4'] 
['attribute5', 'attribute6'] 
['attribute7', 'attribute8', 'attribute9'] 

Le résultat que je veux obtenir est dictio Naries comme:

{'tag1':['attribute1', 'attribute2', 'attribute3','attribute4'} 
{'tag2':['attribute5', 'attribute6']} 
{'tag3':['attribute5', 'attribute6']} 
{'tag4':['attribute5', 'attribute6']} 
{'tag5':['attribute7', 'attribute8', 'attribute9']} 
{'tag6':['attribute7', 'attribute8', 'attribute9']} 

Je pensais que de cette façon, je peux manipuler les données facilement que je peux extraire les données et les écrire dans d'autres formes. Ci-dessous le code que j'ai essayé:

for x in tags: 
    dict = zip(tags, attributes) 
    print (list(dict)) 

Mais la sortie ne semble pas être correcte. Pourriez-vous nous aider à y jeter un coup d'œil et voir comment résoudre ce problème ... Merci beaucoup!

+0

Les balises et les attributs * par ligne * sont-ils garantis uniques? En d'autres termes, '' attribute1 '' ne se produira-t-il que sur line1? –

+0

poster votre contenu 'localNames' – RomanPerekhrest

+0

C'est une bonne question. Je pense que les balises devraient être uniques, mais les attributs peuvent ne pas l'être. – Penny

Répondre

2
tags=[ 
    ['tag1'], 
    ['tag2', 'tag3', 'tag4'], 
    ['tag5', 'tag6'], 
    ] 

    attributes=[ 
       ['attribute1', 'attribute2', 'attribute3', 'attribute4'], 
       ['attribute5', 'attribute6'], 
       ['attribute7', 'attribute8', 'attribute9'], 
      ] 

    for idx, tag_line in enumerate(tags): 
    for tag in tag_line: 
     print {tag : attributes[idx]} 

sortie:

{'tag1': ['attribute1', 'attribute2', 'attribute3', 'attribute4']} 
{'tag2': ['attribute5', 'attribute6']} 
{'tag3': ['attribute5', 'attribute6']} 
{'tag4': ['attribute5', 'attribute6']} 
{'tag5': ['attribute7', 'attribute8', 'attribute9']} 
{'tag6': ['attribute7', 'attribute8', 'attribute9']} 

si vous voulez que le dict a tout l'étiquette dans une liste

from itertools import repeat 
    for tag, attr in zip(tags,attributes): 
    print dict(zip(tag, repeat(attr,len(tag)))) 

sortie:

{'tag1': ['attribute1', 'attribute2', 'attribute3', 'attribute4']} 
{'tag4': ['attribute5', 'attribute6'], 'tag2': ['attribute5', 'attribute6'], 'tag3': ['attribute5', 'attribute6']} 
{'tag5': ['attribute7', 'attribute8', 'attribute9'], 'tag6': ['attribute7', 'attribute8', 'attribute9']} 

demande supplémentaire:

tags, attributes = [], [] 
for i in localNames: 
    tags.append(re.findall(r"local-name\(\)='(.*?)'", i)) 
    attributes.append(re.findall(r"name\(\)='(.*?)'", i)) 
+0

Merci pour la réponse - puis-je demander comment je peux faire les balises et les attributs d'une liste comme votre exemple? En ce moment les étiquettes imprimées que je reçois sont comme ce que j'ai montré dans ma question .. – Penny

+0

@Penny voir ma mise à jour – galaxyan

+0

Salut @galaxyan merci beaucoup! C'est très prometteur! J'ai essayé les codes de requête supplémentaires et je trouve que si j'imprime des attributs, il imprime plusieurs listes séparées avec la dernière qui imprime tout, ce qui est ce dont nous avons besoin/même que votre exemple. J'essaie de comprendre comment imprimer seulement celui dont nous avons besoin maintenant ... – Penny

1

Vous pouvez le faire plus facilement et plus clairement si vous créez explicitement les dictionnaires. zip ne crée pas de dictionnaire.

tags = [ 
    ['tag1'], 
    ['tag2', 'tag3', 'tag4'], 
    ['tag5', 'tag6'] 
] 

attributes = [ 
    ['attribute1', 'attribute2', 'attribute3', 'attribute4'], 
    ['attribute5', 'attribute6'], 
    ['attribute7', 'attribute8', 'attribute9'] 
] 

dict_list = [] 
for t_list, a_list in zip(tags, attributes): 
    for t in t_list: 
     dict_list.append({t: a_list}) 
     print(dict_list[-1]) 
+0

Merci pour la réponse - puis-je demander comment je peux faire les balises et les attributs d'une liste comme votre exemple? En ce moment, les balises imprimées que je reçois sont comme celles que j'ai montrées dans ma question ... – Penny

+0

Dans mon exemple, les balises et les attributs sont stockés dans la liste appelée 'dicts'. Je vais renommer ça en dict_list, donc c'est plus clair. –

+0

Merci pour la réponse! Je vais lire ton code demain! – Penny

0

Vous pouvez y parvenir en appliquant imbriqué maps:

map(
    lambda x: map(
     lambda y: {y: attributes[x[0]]}, 
     x[1] 
    ), 
    enumerate(tags) 
) 
+0

J'ai essayé d'exécuter ceci et cela me donne 'TypeError: () manque 1 argument de position requis: 'x'' – Conic

+0

@Conic Mis à jour la réponse. Dans l'attente de votre estimation de performance pour cette solution! –

+0

J'essaye de reformuler soigneusement ceci comme une fonction qui accepte des attributs, des étiquettes, et renvoie un dictionnaire. Je remarque qu'il y a plusieurs étapes que je devrais prendre qui pourraient modifier considérablement l'estimation de la performance. Si cela ne vous dérange pas, pouvez-vous trouver un moyen de transformer votre carte en dictionnaire? – Conic

1

Une doublure:

guten_tag = { tag: attributes[i] for i, tag_group in enumerate(tags) for tag in tag_group} 

assurez-vous que vous avez une liste appelée tags et une liste appelée attributes comme dans l'autre exemples.

tags = [ 
    ['tag1'], 
    ['tag2', 'tag3', 'tag4'], 
    ['tag5', 'tag6'] 
] 

attributes = [ 
    ['attribute1', 'attribute2', 'attribute3', 'attribute4'], 
    ['attribute5', 'attribute6'], 
    ['attribute7', 'attribute8', 'attribute9'] 
] 

comparaison de vitesse:

galaxy_an réponse est 1.05 µs per loop à l'aide du module 1000000 loopstimeit

jeremy réponse est 1.21 µs à l'aide du module 1000000 loopstimeit

guten_tag (thi Procédé de s) est 850 ns per loop à l'aide du module 1000000 loopstimeit

µs est 10^-6 et nano est 10^-9.

À un niveau très superficiel, ceci vous donne une augmentation de performance de 2-3 ordres de grandeur.