2

如果我有清单:

list1 = [(12, "AB", "CD"), (13, "EF", "GH"), (14, "IJ", "KL")]

我想获取其中值为 13 的组的索引:

if 13 in list1[0]:
      idx = list1.index(13)
      item = list1[idx]
      print str(item)

      [13, EF, GH]

当我尝试这个时,我不断得到“索引不在列表中”,即使它正在传递 if 语句,因为它在列表中找到值 13。

4

2 回答 2

3

您可以使用nextenumerate

>>> list1 = [(12, "AB", "CD"), (13, "EF", "GH"), (14, "IJ", "KL")]
>>> next(i for i,x in enumerate(list1) if 13 in x)
1

使用简单的 for 循环:

for i, item in enumerate(list1):
     if 13 in item:
         print i
         break
...         
1

更新:

如果每个元组中的第一项是唯一的并且您要多次执行此操作,则首先创建一个字典。字典提供O(1)查找,而列表O(N)

>>> list1 = [(12, "AB", "CD"), (13, "EF", "GH"), (14, "IJ", "KL")]
>>> dic = {x[0]:x[1:]  for x in list1}

访问项目:

>>> dic[12]
('AB', 'CD')
>>> dic[14]
('IJ', 'KL')
#checking key existence
>>> if 17 in dic:          #if a key exists in dic then do something
       #then do something
于 2013-07-05T16:20:31.903 回答
0

鉴于评论“我真的不在乎他们在列表中的位置”中添加的标准,任务变得更加容易和明显得多

def get_ids(id, tuple_list):
    """returns members from tuple_list whose first element is id"""
    return [x for x in tuple_list if x[0] == id]

如果您还记得元组是不可变对象,那么这并不像人们预期的那么昂贵。当解释器构建新列表时,它只包含感兴趣的元组的内部 id(引用)。这与要求索引列表的原始问题一致。这里使用的列表推导是构建新列表的有效方式,因为大部分工作都是在解释器内部完成的。简而言之,许多来自类 C 语言的关于性能的直觉并不适用于 Python。

正如Ashwini 所指出的,如果元组中的 id 编号是唯一的,并且您正在进行多个查询,那么字典可能是更合适的结构。即使 id 编号不是唯一的,您也可以使用元组列表字典,但最好先做最清楚的事情,而不是提前猜测性能。

与字典示例一样,因为空列表在 Python 中是“错误的”,所以您可以使用相同的条件:

hits = get_ids(13, list1)
if hits:
    # we got at least one tuple back
else:
    # no 13s to be had
于 2013-07-05T19:20:05.567 回答