仅当部分项目已知时列表中的项目索引

时间:2010-01-11 06:32:22

标签: python search indexing list

这是我之前关于searching in lists of lists

的问题的后续跟进

我有一个列表,其中有一对值作为列表。

  

[['a',5],['b',3],['c',2]]

我知道每对的第一个元素,但我不知道第二个元素(它是计算的结果并存储在第一个元素的列表中。我按计算项目的降序对列表进行了排序。

我想知道每个项目的位置,通常是: list.index('a')如果我没有那里的数字。有没有办法在不知道整个元素的情况下获取索引号?

像: list.index(['a',?])其中?是通配符?

或者我应该只从第一项创建一个新的列表,以获得它的索引?

5 个答案:

答案 0 :(得分:5)

[x[0] for x in list].index('a')

但如果您多次运行此代码,则可能需要保存x [0]的列表。

答案 1 :(得分:4)

与Ofris相似的解决方案

D = dict([ [x[1][0],  x[0] ] for x in list(enumerate(L)) ])
D['a']
#returns 0

但另一个不错的功能是,如果你稍微调整一下,你可以提取原始值

D = dict([ [x[1][0],  (x[0], x[1][1] ) ] for x in list(enumerate(L)) ])
D['a'][0]
#returns 0
D['a'][1]
#returns 5

答案 2 :(得分:2)

简单灵活的单行版本:

[i for (i, item) in enumerate([('a', 1), ('b', 3), ('a', 5)]) if item[0] == 'a']
# returns [0, 2]

[i for (i, item) in enumerate([('a', 1), ('b', 3), ('a', 5)]) if item[0] == 'a'][0]
# returns 0

你可以把它包装在一个函数中,用一个任意谓词调用替换item[0] == 'a'(比如我原来的答案;那就是它的灵活性)等等。如果没有项目,上面的第二个版本会抛出异常找到了,所以将它包装在try / except中;第一个将返回一个空列表。


如果您更喜欢这项工作的单独功能,请查看以下内容......它的好处是只需要消耗尽可能多的迭代来查找合适的项目。

原始答案:

这将允许您找到拥有您可以想到的任何属性的第一个项目的索引,尽管您需要将其表示为一个函数(在您的示例中,lambda x: x[0] == 'a'就足够了):

def index_by(pred, iterable):
    i = 0
    found = False
    for item in iterable:
        if pred(item):
            found = True
            break
        i += 1
    return i if found else None

这样打电话:

index_by(lambda x: x[0] == 'a', [('b', 1), ('a', 5)]) # returns 1

获取满足给定谓词的iterable中第一个项的从零开始的索引。 (换句话说,iterable中的第一个项作为第二个参数传入,作为第一个参数传入的函数返回一个真值。)

如果iterable不包含满足谓词的元素,则返回None

答案 3 :(得分:2)

您已经拥有了解第一个元素的原始列表。列表称之为orig_list。从原始列表中获取元素的索引,并使用新列表中的索引进行检索。

>>> orig_list = ['a','b','c']
>>> calc_list = [['a',5], ['b',3], ['c',2] ]

>>> calc_list[orig_list.index('a')]
['a',5]

答案 4 :(得分:1)

以下代码将获取列表中与模式['a', ?]匹配的所有项目的索引:

>>> l = [['a',5], ['b',3], ['c',2], ['a',8]]
>>> indexes = [l.index(x) for x in l if x[0] == 'a']
>>> print indexes
[0, 3]