3

私は Python が初めてで、いくつかの新しいコード形式を見ています。ここでは、2 つのリストから 1 から 20 までの 5 つの乱数を選択しました。そのようです。

list = []
listn = []
import random
for i in range(5):
     newvar = random.randomint(1,20)
     list.append(newvar)
     newvart = random.randomint(1,20)
     listn.append(newvart)

次に、同じコードで別の変数を選択します。

evar = random.randomint(1,20)

私がやりたいのは、番号が両方のリストにあるかどうか、もしそうなら、それらがリストの同じ位置にあるかどうかを確認することです。次の手順を実行して、これを開始する必要があります。

if (evar in list) and (evar in listn):

しかし、私は残りの方法を知りません。evar が両方のリストにあり、両方のリストで同じ位置にあるかどうかを調べたい (つまり、list と listn の 3 番目の番号である)。どうすればいいですか?

4

5 に答える 5

3

list.index()methodを使用して、最初に見つかった位置が同じであると仮定します。

def f(lst1, lst2, value):
    try: return lst1.index(value) == lst2.index(value)
    except ValueError:
        return False

設定された交差点を使用してすべての位置を許可する:

def positions(lst, value):
    return (pos for pos, x in enumerate(lst) if x == value)

def f(lst1, lst2, value):
    return bool(set(positions(lst1, value)).intersection(positions(lst2, value)))

またはさらに良い: @wimzip()によって提案されたベースのソリューション:

from itertools import izip

def f(lst1, lst2, value):
    return any(x1 == x2 == value for x1, x2 in izip(lst1, lst2))

注:残りのアイテムを不必要に列挙することなくany()、最初のアイテムが見つかるとすぐに戻ります。True

于 2012-03-19T01:10:16.707 に答える
2

編集: これは、以下のコメントでJFが投稿したのと同じ基本的なアイデアです。

any(x1 == x2 == evar for x1, x2 in zip(list1, list2))


>>> def foo(list1, list2, evar):
...   for x1, x2 in zip(list1, list2):
...     if x1 == x2 == evar:
...       return True
...   else:
...     return False
... 
>>> foo([1, 2, 69, 3], [3, 4, 69, 5], 69)
True
>>> foo([1, 2, 69, 3], [3, 4, 69, 5], 3)
False
>>> foo([1, 2, 2, 3], [3, 4, 2, 5], 2)
True

追加のヒントをいくつか紹介します。

  • 変数名として使用listすることは、ビルトインを隠してしまうため避けるべきです。
  • いいえrandom.randomint、あなたが意味したと思いますrandom.randint
  • ランダム リストの生成は、次のように、ループではなくリスト内包表記を使用してうまく行うことができます。 [random.randint(1, 20) for _ in xrange(5)]
于 2012-03-19T01:14:42.673 に答える
1

一致が発生したインデックスを知る必要がある場合は、次のようなものを使用できます

try:
    idx = next(i for i,x in enumerate(list1) if evar==x==list2[i])
    ...
except StopIteration:
    # not found
    ...

またはもっと単純に JF Sebastian の提案を使用する

idx = next((i for i,x in enumerate(list1) if evar==x==list2[i]), -1)

-1一致しない場合は戻ります

于 2012-03-19T02:26:56.377 に答える
0

Python はこれらの点で非常に簡単で、扱いも非常に簡単です。var がリストで取得したインデックスを返す list.index(var) を使用するだけです。

from random import randint 
list1 = []
list2 = []
for i in range(5):
    list1.append(randint(1,20))
    list2.append(randint(1,20))
evan = randint(1,20) 
if (evan in list1 and evan in list 2) and (list1.index(evan) == list2.index(evan)):
    print 'They are at the same place'.
于 2012-03-19T01:16:42.157 に答える
0
if (evar in list):
    if (evar2 in listn):
        if (evar == evar2 and list.index(evar2) == listn.index(evar2):
            do_something()
于 2012-03-19T01:12:35.313 に答える