所以我的一个程序有问题。我有一些列表,它们的长度都相同。这些列表是原始列表的组合。我需要的是特定元素重复多次的索引。例如:
a = ["x","t","y"]
b = ["t","x","y"]
c = ["t","t","y"]
我想让它变成2。
所以我的一个程序有问题。我有一些列表,它们的长度都相同。这些列表是原始列表的组合。我需要的是特定元素重复多次的索引。例如:
a = ["x","t","y"]
b = ["t","x","y"]
c = ["t","t","y"]
我想让它变成2。
让你开始的东西:
In [7]: for i, n in enumerate(zip(a,b,c)): print n, i
('x', 't', 't') 0
('t', 'x', 't') 1
('y', 'y', 'y') 2
map(lambda x: x.count(x[0]) == len(x), zip(*[a, b, c])).index(True)
x.count(x[0]) == len(x)
比len(set(x)) == 1
对于较大的子列表 > 20 个元素lambda x: x == len(x)*[x[0]]
甚至更快:
我想你正在寻找这样的东西:
>>> a = ["x","t","y"]
>>> b = ["t","x","y"]
>>> c = ["t","t","y"]
>>> lis = [a, b, c]
>>> next( i for i,x in enumerate(zip(*lis)) if len(set(x)) == 1)
2
zip(*lis)
解压缩列表,您会得到:
>>> lis = [a, b, c]
>>> zip(*lis)
[('x', 't', 't'), ('t', 'x', 't'), ('y', 'y', 'y')]
现在我们可以遍历这个新列表的每个项目,并检查所有项目在哪个索引处相等。Aset
是最好的检查方法。
>>> set(('y', 'y', 'y'))
set(['y']) #length is 1
单线:
filter(lambda x : a[x] == b[x] and a[x] == c[x], range(len(a)))
请注意,这将返回一个包含所有元素匹配的索引的列表,因此您实际上会得到[2]
,而不是2
结果。
如果您只想要整数值(不是列表):
idxs = filter(lambda x : a[x] == b[x] and a[x] == c[x], range(len(a)))
result = idxs[0] if idxs else None