2016-12-05 3 views
-1

Code actuel:supprimer des éléments en double dans la liste

mylist = [('x', 'Value1', 'Value2'), ('x', 'Value3', 'Value4')] 

for item in mylist: 
    item[0], item[1], item[2] 

courant pour la sortie en boucle:

x, Value1 : Value2, 
x, Value3 : Value4 

voulait sortie:

x, "Value1 : Value2, Value3 : Value4" 

(ce sont deux points de chaîne que je me rends)

Qu'est-ce que c'est? la meilleure et la bonne façon de faire cela?

(je le rendre dans un modèle .mako)

+0

Qu'est-ce que vous voulez vraiment accomplir? Vous dites que vous voulez supprimer des éléments en double d'une liste, mais je ne vois aucun doublon dans l'exemple que vous fournissez? –

+1

est-il correct de mélanger les deux-points et les virgules comme séparateur ou vous voulez une virgule séparant toutes les valeurs? – danielfranca

+0

Les valeurs 'x' sont ce que je voulais dire. – Emre

Répondre

2

Vous pouvez utiliser des dictionnaires pour cela, en ajoutant le premier élément en tant que clé. Ensuite, ajoutez les 2 derniers éléments en tant que dictionnaire interne en tant que clé et valeur.

mylist = [('x', 'Value1', 'Value2'), ('x', 'Value3', 'Value4'), ('y', 'vvvv', 'mmmm')] 

d = {} 

for item in mylist: 
    d.setdefault(item[0], "") 
    d[item[0]] += ", " if len(d[item[0]]) else "" 
    d[item[0]] += "{}: {}".format(item[1], item[2]) 

result = [] 
for k, v in d.items(): 
    t = [k] 
    t.append(v) 
    result.append(tuple(t)) 

print(result) 

Il vous donne déjà la sortie que vous désirez:

[('y', 'vvvv: mmmm'), ('x', 'Valeur1: Valeur2, Value3: Value4') ]

+0

Eh bien, je ne peux pas avoir l'air de travailler (à l'avant). Comment puis-je passer ceci dans une liste pour que je puisse accéder au 'x' avec [0] et 'Value1': 'Value2', 'Value3': 'Value4' avec [1]? – Emre

+0

@Emre Juste mis à jour le code avec le format que vous voulez, vous pouvez y accéder sous forme de liste. Laissez-moi savoir si cela fonctionne. – danielfranca

+1

Daniel Franca m'a guidé à travers un chat personnel et nous avons finalement réussi à le faire fonctionner. C'est un gars vraiment cool et calme. Il mérite plus que juste un +1. – Emre

2

Vous pouvez résoudre ce problème en utilisant un dictionnaire comme suit

mylist = [('x', 'Value1', 'Value2'), ('x', 'Value3', 'Value4')] 

d = {} 

for item in mylist: 
    x = item[0] 
    if x in d: 
     d[x].append((item[1], item[2])) 
    else: 
     d[x] = [(item[1], item[2])] 

for key in d: 
    print key, d[key] 

Le dictionnaire d permet au club ensemble toutes les occurrences en double de item[0] et ajoutez le n-uplet (item[1], item[2]) à une liste associée à chaque valeur unique de item[0]

Je crois que vous pouvez ajuster le code pour obtenir le formulaire de sortie t vous désirez

+0

J'essaye de passer ceci comme une liste, de sorte que je puisse parcourir la liste et obtenir la sortie désirée (exemple en question.) Mais je n'arrive pas à le faire fonctionner de cette façon – Emre

0

que diriez-vous de ce code?

from collections import defaultdict 

mylist = [('x', 'Value1', 'Value2'), ('x', 'Value3', 'Value4'), ('x2', 'value5', 'value6')] 
result = defaultdict(list) 
for item1, item2, item3 in mylist: 
    result[item1].append({item2:item3}) 

print(result) 

sortie

defaultdict(<class 'list'>, {'x': [{'Value1': 'Value2'}, {'Value3': 'Value4'}], 'x2': [{'value5': 'value6'}]}) 
+0

sortie courant: x {'Value1 ':' Value2 '} {' Value3 ':' Value4 '}. Ce qui n'est pas itérable, je veux qu'il soit itérable pour que je puisse le parcourir et obtenir l'exemple dans la question. – Emre

+0

Je modifie le code, vous pouvez accéder aux éléments du dictionnaire de sortie. – Minji

0

Profitez de l'collections.defaultdict!

import collections 
mylist = [('x', 'Value1', 'Value2'), ('x', 'Value3', 'Value4')] 
answer = collections.defaultdict(list) 
for group in mylist: 
    key = group[0] 
    rest = group[1:] 
    values = [x for x in rest] 
    answer[key] += values 

# Output 
# In [5]: answer 
# Out[5]: defaultdict(list, {'x': ['Value1', 'Value2', 'Value3', 'Value4']})