列表与此类似:
[["12", "stuA", "stuB"], ["51", "stuC", "stuD"], ..., ["3234", "moreStuff", "andMore"]]
现在我需要仅通过其第一个值(例如"332"
)来定位项目(获取索引)。有没有更好的方法来做到这一点,除了从第一个迭代以与每个值进行比较?
代码:
index = 0
for item in thelist:
if item[0] == "332":
print index
index = index + 1
答案 0 :(得分:12)
否。如果没有迭代,则无法找到它,除非列表已经排序。您可以使用enumerate
和列表理解来改善您的代码。
[index for index, item in enumerate(thelist) if item[0] == "332"]
这将给出第一个元素为332
的所有元素的索引。
如果您知道332
只出现一次,则可以执行此操作
def getIndex():
for index, item in enumerate(thelist):
if item[0] == "332":
return index
答案 1 :(得分:9)
没有人提到这一点,所以我会 - 如果你需要快速找到一个项目的价值(并且可能不止一次),你应该改变你用来支持那种类型的数据结构。访问你需要的。列表支持按索引快速访问,但不支持按项目值。如果您将信息存储在由列表中的第一个元素键入的dict中,您将能够通过第一个值快速找到行 very :
# Make a dict from the list of lists:
itemLookup = {item[0]: item for item in theList}
itemLookup["51"] # -> ["51", "stuC", "stuD"]
所以简短的答案是否定的(尽管如果列表已经排序,有一种使用二分法的快捷方式),如果你想快速查找,则使用字典的答案就更长。
答案 2 :(得分:2)
如果你绝对可以保证你想要的密钥存在一次,那么这也可以。
import itertools
itertools.ifilter(lambda x: x[1][0] == "332", enumerate(theList)).next()[0]
如果您修改它以使用生成器对象而不是像我这样立即调用next
,则可以使用多次出现。
如果可行的话,我建议将数据移动到dict
格式(OrderedDict
,如果出现位置很重要)这些整数作为键(因为你可以保证它们是唯一的) ,或者可能是以整数作为索引的pandas DataFrame。
答案 3 :(得分:2)
如果密钥恰好出现一次,
zip(*thelist)[0].index("332")