Come costruire un set di voci fuori elenco in Python?


170

Ho un listnome di file in Python e vorrei costruire un setnome di tutti i nomi di file.

filelist=[]
for filename in filelist:
    set(filename)

Questo non sembra funzionare. Come può farlo?

Risposte:


322

Se hai un elenco di oggetti hash (i nomi dei file probabilmente sarebbero stringhe, quindi dovrebbero contare):

lst = ['foo.py', 'bar.py', 'baz.py', 'qux.py', Ellipsis]

puoi costruire il set direttamente:

s = set(lst)

In effetti, setfunzionerà in questo modo con qualsiasi oggetto iterabile! (L'anatra non sta scrivendo alla grande?)


Se vuoi farlo iterativamente:

s = set()
for item in iterable:
    s.add(item)

Ma raramente è necessario farlo in questo modo. Lo cito solo perché il set.addmetodo è abbastanza utile.


1
Sto usando 2.7 e questo non sembra funzionare. Cosa sta succedendo qui? Python 2.7.13 (impostazione predefinita, 24 luglio 2017, 14:22:59) [GCC 4.2.1 Apple compatibile LLVM 8.1.0 (clang-802.0.42)] su darwin Digita "help", "copyright", "credits" o "licenza" per ulteriori informazioni. >>> x = [1,2,3] >>> set (x) set ([1, 2, 3]) >>>
opus111

@ user1902291-- Sembra che abbia funzionato, devi solo tenere traccia del set risultante: y = set(x)
mgilson

Si noti inoltre che l'aggiunta di elementi nel set da un elenco può rivelarsi molto utile quando si desidera filtrare i duplicati dall'elenco.
Pranjal Kumar,

12

La soluzione più diretta è questa:

 s = set(filelist)

Il problema nel codice originale è che i valori non venivano assegnati al set . Ecco la versione corretta del tuo codice:

 s = set()
 for filename in filelist:
     s.add(filename)
 print(s)

9

Tu puoi fare

my_set = set(my_list)

o, per Python 3,

my_set = {*my_list}

per creare un set da un elenco. Al contrario, puoi anche farlo

my_list = list(my_set)

o, per Python 3,

my_list = [*my_set]

per creare un elenco da un set.

Si noti che l'ordine degli elementi in un elenco viene generalmente perso durante la conversione dell'elenco in un set poiché un set è intrinsecamente non ordinato. (Un'eccezione in CPython, tuttavia, sembra essere se l'elenco è costituito solo da numeri interi non negativi, ma suppongo che questa sia una conseguenza dell'implementazione di set in CPython e che questo comportamento possa variare tra diverse implementazioni di Python.)


4

Ecco un'altra soluzione:

>>>list1=["C:\\","D:\\","E:\\","C:\\"]
>>>set1=set(list1)
>>>set1
set(['E:\\', 'D:\\', 'C:\\'])

In questo codice ho usato il metodo set per trasformarlo in un set e quindi ho rimosso tutti i valori duplicati dall'elenco


1

Un modo generale per costruire set in modo iterativo come questo:

aset = {e for e in alist}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.