检查两个变量是否在同一个列表中

时间:2013-09-07 19:03:54

标签: python list variables python-3.x python-3.3

在对它们做某事之前,确保两个不同变量在同一个列表中的最佳方法是什么?例如:

var1 = 1
var2 = 2
var3 = 3
var4 = 4
list1 = [var1, var2, var3, var4]
var5 = 5
var6 = 6
var7 = 7
var8 = 8
list2 = [var5, var6, var7, var8]

if var1 and var2 (are in the same list):
    print("In the same list")
else: 
    print("Not the same")

使用元组或其他内容代替列表会更好吗?这样会更容易吗?

3 个答案:

答案 0 :(得分:3)

>>> list1 = list(range(1, 5))
>>> 1 in list1 and 2 in list1
True
>>> 1 in list1 and 6 in list1
False

如果您要检查多个项目,请转到all

>>> to_be_checked = [1, 2, 3, 4]
>>> all(item in list1 for item in to_be_checked)
True

不要为每个项目创建单独的变量,只需从一开始就将它们放在列表中。


对于效率使用集,集合提供O(1) loopkup。请注意,集合没有任何顺序,您无法对它们建立索引

>>> list1 = list(range(10**5))
>>> s = set(range(10**5))
>>> %timeit 1000 in list1 and 10**5 in list1
100 loops, best of 3: 2.71 ms per loop
>>> %timeit 1000 in s and 10**5 in s
1000000 loops, best of 3: 403 ns per loop

答案 1 :(得分:3)

最简洁的方法是测试你的var_1和var_2是否是你的一个或多个列表的子集

list_a = [1,2,3,4]
list_b = [5,6,7,8]
test_list = [1,4]    
if set(test_list)issubset(set(list_a)):
    do something

这会以列表形式保存您的数据,以便您可以使用它们执行您喜欢的操作,并且速度快且不像使用和语句那样令人困惑 - 在我看来,这会增加代码的不必要的复杂性

为了清楚起见我要求Python测试作为其成员的test_list成员是否是该成员的一个子集,其成员是list_a的成员

实际上我认为你在这里要求更具体的东西 - 所以你有一些列表 - 大概你有办法让你的列表可以迭代它们

 my_lists = [ [1,2,3,4], [5,6,7,8]]

 temp_list = [1,4]

 for each_list in my_lists:
     if set(temp_list).issubset(set(each_list)):
         print 'members of the same list'
      else:
         print 'not members of the same list'

答案 2 :(得分:0)

从表面上看:

if ((var1 in list1 and var2 in list2) or (var1 in list2 and var2 in list2))

概括一下:

mylists = (list1, list2)
if any(var1 in x and var2 in x for x in mylists)

进一步概括:

mylists = (list1, list2)
myvars = (var1, var2)
if any(all(v in x for v in myvars) for x in mylists)

或者你可以完全不同地看待它:

which_list = dict()
which_list.update((val, 1) for val in list1)
which_list.update((val, 2) for val in list2)

if which_list[var1] == which_list[var2]

当然,假设每个变量都出现在一个列表中。

请注意,在所有情况下,您都没有真正检查变量是否在列表中。变量不能在列表中。您正在检查变量当前值是否在列表中。因此,如果任何变量引用相同的值,那么就无法从列表中判断出哪个变量名用于将值放入列表中。

正如Ashwini Chaudhary所说,set通常比inlist执行tuple更快。但对于这样的小名单,它不太可能产生明显的差异。