4

在对它们进行操作之前确保两个不同的变量在同一个列表中的最佳方法是什么?例如:

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

使用元组或其他东西而不是列表会更好吗,这会更容易吗?

4

3 回答 3

4
>>> 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
于 2013-09-07T19:04:58.620 回答
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

这会将您的数据保留在它们的列表形式中,这样您就可以对它们做您喜欢的事情,而且它速度快而且不像使用 and 语句那样令人困惑——我认为这会给代码增加不必要的复杂性

为了清楚起见,我要求 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'
于 2013-09-07T22:09:27.193 回答
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 所说, aset通常可以比 a or执行in得更快。但是对于如此小的列表,它不太可能产生明显的差异。listtuple

于 2013-09-07T21:39:05.563 回答