在对它们做某事之前,确保两个不同变量在同一个列表中的最佳方法是什么?例如:
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")
使用元组或其他内容代替列表会更好吗?这样会更容易吗?
答案 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
通常比in
或list
执行tuple
更快。但对于这样的小名单,它不太可能产生明显的差异。