3

我对 Python 有点陌生,我正在研究一些新的代码形式。我在两个列表中选择了 5 个介于 1 到 20 之间的随机数。像这样。

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 中的第三个数字)。我该怎么做?

4

5 回答 5

3

假设第一个找到的位置应该是相同的使用list.index()方法

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
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 回答
0

Python 在这些方面真的很容易,它非常容易处理。只需使用 list.index(var) 即可返回 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 回答