70

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

8 に答える 8

102

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

>>> 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 セットを非常に迅速に作成できます。または、すでにリストがある場合

unique_ids = set(id_list)

入力を数値形式で取得する場合は、次のようなことができます

>>> ids = [int(n) for n in '350882 348521 350166\r\n'.split()]
>>> ids
[350882, 348521, 350166]
于 2013-06-28T18:11:45.637 に答える
8

あなたの例ではいくつかのことが起こっています。数字と改行文字の文字列を含むリストがあります。

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

そして、このリスト内で番号 ID を見つけようとしています。

id = 348521
if id not in list:
    ...

の文字列値を持つindex に 1 つの要素を持つ整数348521を探すため、最初の条件は常にパスします。そのため、整数 348521 がそのリストに追加され、文字列と文字列の 2 つの要素のリストになります。出力が示すように、整数。listlist[0]'350882 348521 350166\r\n'

繰り返しますが、リストは、リストの最初の要素の文字列ではなく、id で検索されます。

'348521'の文字列表現が、リストに含まれるより大きな文字列に含まれているかどうかを確認しようとしている場合は、次の手順を実行できます。ただし、 の各要素に対してこれを行う必要があることに注意してlistください。

if str(id) not in list[0]: # list[0]: '350882 348521 350166\r\n'
    ...                    #                  ^^^^^^

ただし、検索のために空白で囲む必要があることに注意してくださいstr(id)。そうしないと、次のようにも一致します。

2348521999
 ^^^^^^

「リスト」を「空白で区切られた整数の文字列」にするか、それとも整数のリストが本当に必要かは不明です。

達成しようとしているのが ID のリストを持ち、ID がまだ含まれていない場合にのみそのリストに ID を追加することだけである場合 (およびリスト内の要素の順序が重要でない場合)、セットは使用するのに最適なデータ構造になります。

ids = set(
    [int(id) for id in '350882 348521 350166\r\n'.strip().split(' ')]
)

# Adding an ID already in the set has no effect
ids.add(348521)

文字列内の ID の順序が重要な場合は、ID を標準リストに保持し、条件付きチェックを使用します。

ids = [int(id) for id in '350882 348521 350166\r\n'.strip().split(' ')]

if 348521 not in ids:
    ...
于 2019-05-09T05:39:42.777 に答える
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
于 2013-06-28T18:19:39.370 に答える
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']
于 2013-06-28T18:17:03.690 に答える
0

構造を本当に変更したくない場合、または少なくとも同じデータを含むコピーを作成したい場合 (たとえば、舞台裏でその文字列を読み書きするセッターとゲッターを使用してクラス プロパティを作成する場合)、次のようにします。正規表現を使用して、アイテムがその「リスト」にあるかどうかをいつでも確認できます。そうでない場合は、別の要素として「リスト」に追加します。

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

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

于 2013-06-28T18:21:17.957 に答える
-2

id 変数は、リストに要素が 1 つしかない数値です。これは、他の ID を含む文字列です。id がその文字列に含まれているかどうかを確認するか、文字列から数字を取り出してリストに個別に保存する必要があります

list  = [350882, 348521, 350166]
于 2013-06-28T18:13:56.163 に答える