2013-06-28 11 views
17

Sto provando a verificare se l'id è in un elenco e aggiungere l'id solo se non è nell'elenco utilizzando il codice riportato di seguito..in ogni caso vedo che l'ID viene aggiunto anche se l'id è già presente nella lista .. qualcuno può fornire input su cosa c'è di sbagliato qui?Aggiungere un id a un elenco se non è già presente

list = ['350882 348521 350166\r\n'] 
    id = 348521 
    if id not in list: 
     list.append(id) 
    print list 

OUTPUT:- 
['350882 348521 350166\r\n', 348521] 
+1

L'ID è una parte della stringa, motivo per cui il valore è aggiunto. '348521' non è uguale a quella stringa. –

+0

Perché il contenuto della lista strana? a) sono stringhe, b) sembrano esserci più ID in un elemento. Ti suggerirei di canonizzare la struttura dei dati per prima cosa. –

+0

@NilsWerner - come verificare se un ID è già presente in un elemento che contiene più ID – user2341103

risposta

37

Quello che stai cercando di fare può quasi certamente essere raggiunto con un set.

>>> x = set([1,2,3]) 
>>> x.add(2) 
>>> x 
set([1, 2, 3]) 
>>> x.add(4) 
>>> x.add(4) 
>>> x 
set([1, 2, 3, 4]) 
>>> 

utilizzando il metodo di aggiunta di un set è possibile creare il proprio insieme univoco di ID molto rapidamente. Oppure, se si dispone già di un elenco

unique_ids = set(id_list) 

come per ottenere gli ingressi in forma numerica si può fare qualcosa di simile

>>> ids = [int(n) for n in '350882 348521 350166\r\n'.split()] 
>>> ids 
[350882, 348521, 350166] 
+2

Ma l'insieme non è ordinato. Se OP vuole mantenere l'ordine originale della lista, questo non funzionerà. – LWZ

+0

Sei corretto, se i futuri visitatori devono mantenere l'ordine possono prendere in considerazione l'implementazione di un [insieme ordinato] (https://stackoverflow.com/questions/1653970/does-python-have-an-ordered-set) . – John

-1

La variabile id è un numero in cui la vostra lista ha un solo elemento. È una stringa che contiene gli altri tuoi ID. Si sia necessario verificare se id è in quella stringa, o tirare i numeri su corda e memorizzarli nella lista separatamente

list = [350882, 348521, 350166] 
2

L'elenco contiene solo una stringa. Convertirlo in ID interi:

L = ['350882 348521 350166\r\n'] 

ids = [int(i) for i in L[0].strip().split()] 
print(ids) 
id = 348521 
if id not in ids: 
    ids.append(id) 
print(ids) 
id = 348522 
if id not in ids: 
    ids.append(id) 
print(ids) 
# Turn it back into your odd format 
L = [' '.join(str(id) for id in ids) + '\r\n'] 
print(L) 

uscita:

[350882, 348521, 350166] 
[350882, 348521, 350166] 
[350882, 348521, 350166, 348522] 
['350882 348521 350166 348522\r\n'] 
+0

Voglio mantenerli come stringhe – user2341103

+1

Aggiorna la tua domanda con l'output desiderato. Noi non siamo lettori della mente! –

+0

@ user2341103, Sembra che tu abbia letto i valori da un file. Basta scriverlo di nuovo unito in stringhe. Risposta aggiornata con esempio. –

7

Sono d'accordo con le altre risposte che si sta facendo qualcosa di strano qui. Hai una lista contenente una stringa con più voci che sono essi stessi numeri interi che stai confrontando con un ID intero.

Questo non è quasi sicuramente quello che dovresti fare. Probabilmente dovresti prendere in input e convertirlo in numeri interi prima di memorizzarlo nella tua lista. Potresti farlo con:

input = '350882 348521 350166\r\n' 
list.append([int(x) for x in input.split()]) 

Quindi il test passerà. Se davvero si è sicuri di non si vuole fare quello che stai facendo attualmente, il seguente dovrebbe fare quello che vuoi, che è quello di non aggiungere il nuovo ID già esistente:

list = ['350882 348521 350166\r\n'] 
id = 348521 
if id not in [int(y) for x in list for y in x.split()]: 
    list.append(id) 
print list 
+0

è "int (y) per x nell'elenco per y in x.split()" è valido? – user2341103

+0

@user: sì, dovrebbe essere valido. Sembra strano, lo so. I loop "for" dovrebbero essere letti nell'ordine in cui sono scritti. Quindi prendi qualsiasi cosa prima del ciclo for come risultato. – JoshG79

0

Se davvero don Voglio cambiare la tua struttura, o almeno crearne una copia contenente gli stessi dati (ad esempio, crea una proprietà di classe con un setter e un getter che leggono/scrivono in quella stringa dietro le quinte), quindi puoi usare un normale espressione per verificare se un elemento si trova in quella "lista" in un dato momento e, in caso contrario, aggiungerlo alla "lista" come elemento separato.

if not re.match("\b{}\b".format(348521), some_list[0]): some_list.append(348521)

Questo è probabilmente più veloce di convertirlo in un set ogni volta che si desidera controllare se un oggetto è in esso. Ma usando set come altri hanno suggerito qui è un milione di volte meglio.

Problemi correlati