0

所以我的一个程序有问题。我有一些列表,它们的长度都相同。这些列表是原始列表的组合。我需要的是特定元素重复多次的索引。例如:

a = ["x","t","y"]
b = ["t","x","y"]
c = ["t","t","y"]

我想让它变成2。

4

4 回答 4

1

让你开始的东西:

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
于 2013-06-14T21:16:06.353 回答
1
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]]甚至更快:

于 2013-06-14T22:19:41.667 回答
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
于 2013-06-14T21:16:25.083 回答
0

单线:

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
于 2013-06-14T21:18:02.197 回答