这是我的问题:
我有一个元组列表(a,b,c),我想找到以给定的'a'和'b'开头的第一个元组的索引。
示例:
list = [(1,2,3),(3,4,5),(5,6,7)]
我想,给定a = 1,b = 2,返回0(索引为(1,2,3))
这是我找到的解决方案,但效率非常低:
index0(list) # returns a list of all first elements in tuples
index1(list) # returns a list of all second elements in tuples
try:
i = index0.index(a)
j = index1.index(b)
if i == j:
print(i)
答案 0 :(得分:0)
这是使用生成器表达式执行此操作的一种方法,该方法通过调用gen上的next
来返回第一个匹配元组的索引。进出口。 enumerate
返回每个元组的索引和元组本身:
t = [(1,2,3), (3,4,5), (5,6,7)]
a = 1
b = 2
val = next(ind for ind, (i, j, _) in enumerate(t) if i==a and j==b)
print(val)
# 0
如果找不到包含给定值的元组,您将收到错误。
另一方面,如果要收集符合条件的所有元组,可以使用列表推导。
答案 1 :(得分:0)
这是一种容错方式。注意,如果它没有找到任何匹配的元组,则返回-1:
In [3]: def find_startswith(tuples, a, b):
...: for i, t in enumerate(tuples):
...: try:
...: f, s, *rest = t
...: if f == a and s == b:
...: return i
...: except ValueError as e:
...: continue
...: else:
...: return -1
...:
...:
In [4]: x
Out[4]: [(1, 2, 3), (3, 4, 5), (5, 6, 7)]
In [5]: find_startswith(x, 1,2)
Out[5]: 0
In [6]: find_startswith(x, 3, 2)
Out[6]: -1
In [7]: find_startswith(x, 3, 4)
Out[7]: 1
In [8]: find_startswith(x, 4, 5)
Out[8]: -1
In [9]: find_startswith(x, 5, 6)
Out[9]: 2
答案 2 :(得分:0)
您可以使用filter()
:
try:
item = next(filter(lambda item: item[0:2] == (a, b), my_list))
index = my_list.index(item)
except StopIteration:
print("No matching item") # Or for example: index = -1
<强>输出:强>
>>> my_list = [(1,2,3), (3,4,5), (5,6,7)]
>>>
>>> a, b = 5, 6
>>>
>>> item = next(filter(lambda item: item[0:2] == (a, b), my_list))
>>> item
(5, 6, 7)
>>>
>>> index = my_list.index(item)
>>> index
2