元组列表中不完整元组的索引

时间:2017-01-02 16:51:52

标签: python list python-3.x search indexing

这是我的问题:

我有一个元组列表(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)

3 个答案:

答案 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