【问题标题】:How can I find each occurrence of a item in a list and print its each occurrences index number?如何在列表中找到每个项目的出现并打印其每个出现的索引号?
【发布时间】:2019-08-11 20:22:54
【问题描述】:

我希望能够查看 python 列表并打印出每个出现的索引号。 示例:

a = ['t','e','s','t']
a.index('t')

当我尝试这段代码时,它只给了我 t 的第一个索引号,但我希望它打印出 t 使用的每个索引号。

【问题讨论】:

  • 您必须自己遍历列表并记录索引
  • 你知道enumerate(a) 和列表推导吗?
  • 我听说过enumerate(),但我不知道如何使用它。
  • CoderDude:当然。每当你发现自己在写 for i in range(len(something)) 时,总是有 enumerate(something) 的代码味道。由于这避免了需要循环,因此它建议使用列表理解(可能带有条件)。
  • 您只想查找出现的项目“t”(如您的代码所暗示的那样),还是列表中的所有元素(如您的标题所暗示的那样)?后者对于我们其他人来说更普遍。你能修正你的标题或代码吗?

标签: python arrays list indexing enumerate


【解决方案1】:
def get_indices(my_list, item):
    result = []
    for i in range(len(my_list)):
        if my_list[i] == item:
            result.append(i)
    return result

那就试试吧……

>>> get_indices(a, "t")
[0, 3]

【讨论】:

  • 这就是enumerate() 的用途。不需要循环。一直列出推导式。更简洁、更短、更 Pythonic。
  • 但仍然是一个很好的工作解决方案。我个人更喜欢循环方式。
  • @PikachuthePurpleWizard:为什么?这是一个笨重的、混淆的、非 Pythonic 的解决方案;效率较低且较慢。这是 Java 编码器生成的那种东西。它表明对 Python 习语没有理解。 for i in range(len(list)) 始终是 enumerate(list) 的代码气味
  • @smci 好吧,我是一名 java 编码员。我习惯了很多循环。但是,我的观点是,即使它不使用内置的实用方法,它仍然可以很好地工作。
  • 请不要隐藏像 list 这样的内置名称。它不会损害您的get_indices 函数中的任何内容,但一般来说,如果后续代码尝试调用list,它可能会导致带有神秘错误消息的错误。而且我们不希望阅读 SO 答案的新程序员养成这样的坏习惯。
【解决方案2】:

tlist comprehension 中使用 enumerate

>>> list1 = ['t','e','s','t']
>>> all_index = [i for i, j in enumerate(list1) if j == 't']
>>> all_index

输出:

[0, 3]

所有元素都有循环,

list1 = ['t','e','s','t']
result = {}
for e in list1:
    result[e] = [i for i, j in enumerate(list1) if j == e]
print(result)

输出:

 {'s': [2], 'e': [1], 't': [0, 3]}

【讨论】:

  • 您的第一个解决方案很好。您的第二个解决方案应该在没有效率低下的双循环的情况下编写,并且它不应该计算 result['t'] 两次。
【解决方案3】:

您可以使用enumerate 的列表推导:

a = ['t','e','s','t']
indices = [i for i, x in enumerate(a) if x == 't']

在列表推导中,i 是当前索引,x 是该索引处的值。

【讨论】:

  • 你的意思是[(i,x) for i, x in enumerate(a)]?否则,您只比较 x == 't',而不是所有元素。
  • @smci 对不起,我对你在说什么感到很困惑。我怎么没有找到所有的索引?输出应该是什么?
  • 您所拥有的仅找到项目“t”的出现。不是所有项目。问题是“查看列表并打印出每个出现的索引号”。
  • @smci 我解释标题的方式是查找单个项目的所有出现。问题中没有任何内容暗示“所有项目”。当然,如果您可以详细说明 OP 究竟在哪里指定了“所有项目”而不是单个项目,那将不胜感激。
  • 没有必要进行劳累的讽刺。就像我说的那样,标题显然与第一行说的“查看列表并打印出每个出现的索引号”相冲突。如果在解释它之间做出选择,例如不提供非常可重用的资源(例如,仅用于项目 't'),我们应该选择更通用的方式(“所有项目”)。
【解决方案4】:

是的,您可以使用 enumerate 完成此操作

[x[0] for x in enumerate(a) if x[1]=='t']

Out[267]: [0, 3]

【讨论】:

  • 这当然有效,但使用索引比元组解包更冗长且稍慢,就像 Tomothy32 的答案使用的那样。
猜你喜欢
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
相关资源
最近更新 更多