这是我之前关于searching in lists of lists
的问题的后续跟进我有一个列表,其中有一对值作为列表。
[['a',5],['b',3],['c',2]]
我知道每对的第一个元素,但我不知道第二个元素(它是计算的结果并存储在第一个元素的列表中。我按计算项目的降序对列表进行了排序。
我想知道每个项目的位置,通常是:
list.index('a')
如果我没有那里的数字。有没有办法在不知道整个元素的情况下获取索引号?
像:
list.index(['a',?])
其中?
是通配符?
或者我应该只从第一项创建一个新的列表,以获得它的索引?
答案 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]