2013-06-28 7 views
17

idがリストに含まれているかどうかをチェックし、そのIDがリスト内にない場合にのみ追加しようとしています。以下のコードを使用しています。 idは既にリストに存在していますが、誰かがここで何が間違っているのか入力を提供できますか?まだ存在しない場合、リストにIDを追加する

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

あなたのIDは文字列の一部です。そのため、値が追加されます。 '348521'はその文字列と等しくありません。 –

+0

なぜ奇妙なリストの内容ですか? a)文字列であり、b)1つの要素に複数のIDがあるようです。最初にデータ構造を正規化することをお勧めします。 –

+0

@NilsWerner - IDが複数のIDを含む1つの要素に既に存在するかどうかを確認する方法 – user2341103

答えて

37

あなたがしようとしていることは、ほぼ確実にセットで達成できます。

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

セットのaddメソッドを使用すると、独自のIDセットを非常に迅速に作成できます。あなたはすでにあなたが

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

しかし、セットは順序付けられていません。 OPがリストの元の順序を維持したい場合、これは機能しません。 – LWZ

+0

将来のビジターが注文を維持する必要がある場合は、[順序付けられたセット](https://stackoverflow.com/questions/1653970/does-python-have-an-ordered-set)の実装を検討するかもしれないが、 。 – John

-1

あなたのid変数のような何かを行うことができ、数値の形であなたの入力を取得するためとしてリストに

unique_ids = set(id_list) 

を持っている場合、またはあなたのリストには、一つだけの要素を持っている数です。他のIDを含む文字列です。あなたは、どちらかのidがその文字列であるかどうかを確認、または文字列から数字を引き、あなたのリストは単なる文字列が含まれている

list = [350882, 348521, 350166] 
2

別途リストに保存する必要があります。整数のIDに変換します

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) 

出力:私はあなたがここに奇妙な何かをやっている他の回答に同意

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

文字列としてそれらを維持したい – user2341103

+1

あなたの質問をあなたの出力に更新してください。私たちは読者ではありません! –

+0

@ user2341103、ファイルから値を読み取るようです。それを書き戻して文字列に戻してください。例を使って答えを更新しました。 –

7

。複数のエントリを持つ文字列を含むリストがあります。複数のエントリは、整数のIDと比較する整数です。

これはほとんどあなたがやっているべきではありません。おそらく、あなたのリストに格納する前に、入力して整数に変換する必要があります。

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

これでテストできます。あなたは本当にあなたが現在やっているしたくないことを確認している場合は、次のことがすでに存在している新しいIDを追加しないようにしている、あなたが欲しいものを行う必要があります。

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

はx.split()内のyのリスト内のxのint(y)が有効ですか? – user2341103

+0

@user - yesは有効である必要があります。それは奇妙に見える、私は知っている。 "for"ループは、書かれた順に読み込まなければなりません。結果としてforループの前にあるものはすべて取ります。 – JoshG79

0

あなたが本当にドン場合あなたの構造を変更したい、または少なくとも同じデータを含むそのコピーを作成する(例えば、その文字列を読み書きするsetterとgetterでクラスプロパティを作成するなど)、通常の指定した時間にアイテムがその "リスト"に含まれているかどうかをチェックし、そうでなければ "リスト"に別の要素として追加します。

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

これはおそらくセットにアイテムがそれであるかどうかを確認するたびに、それを変換するよりも高速です。しかし、setを使用して他の人がここで示唆したように百万倍良いです。

関連する問題