检测项目是否是列表中的最后一个

新手上路,请多包涵

我正在使用 Python 3,并试图检测一个项目是否是列表中的最后一个,但有时会重复。这是我的代码:

 a = ['hello', 9, 3.14, 9]
for item in a:
    print(item, end='')
    if item != a[-1]:
        print(', ')

我想要这个输出:

 hello,
9,
3.14,
9

但我得到这个输出:

 hello,
93.14,
9

我明白为什么我得到我不想要的输出。如果我仍然可以使用循环,我会更愿意,但我可以解决它们。 (我想用更复杂的代码来使用它)

原文由 nedla2004 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 741
2 个回答

与其尝试检测你是否在最后一项,不如在 打印下 一项时打印逗号和换行符(只需要检测你是否在第一项):

 a = ['hello', 9, 3.14, 9]
for i, item in enumerate(a):
    if i:  # print a separator if this isn't the first element
        print(',')
    print(item, end='')
print()  # last newline

enumerate() 函数向每个元素添加一个计数器(请参阅 枚举是什么意思? ),并且 if i: 对计数器的所有值都是正确的,除了 0 第一个元素)。

或者使用 print() 插入分隔符:

 print(*a, sep=',\n')

sep 值被插入到每个参数之间( *a 应用 a 中的所有值作为单独的参数 (星号,见 double 是什么) ) 做参数? )。这比使用 print(',n'.join(map(str, a))) 更有效,因为这不需要先构建一个全新的字符串对象。

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 3.0 许可协议

虽然这些答案可能适用于 OP 的特定情况,但我发现它们不适合更广泛的应用。

以下是我在这里可以想到/看到的方法及其各自的时间安排。

负片方法一

for x in urlist[:-1]:
    pass
# <- handle last item here

负切片方法 2

 last_item = urlist[-1]
for x in urlist:
    if x == last_item:
        pass

枚举方法

urlist_len = len(urlist)-1
for index, x in enumerate(urlist):
    if index == urlist_len:
        pass

结果:

 ┌─────────────────────────┬───────┬───────┬───────┐
│        list size        │ 10**2 │ 10**4 │ 10**8 │
├─────────────────────────┼───────┼───────┼───────┤
│ negative slice method 1 │ 2e-6  │ 2e-4  │     3 │
│ negative slice method 2 │ 1e-6  │ 1e-4  │     1 │
│ enumerate               │ 2e-6  │ 2e-4  │     2 │
└─────────────────────────┴───────┴───────┴───────┘

负切片方法 2 在所有情况下都是最快的, 但如果您的列表中有重复项,负切片方法 2 会给您一个误报。此外,负切片方法要求您迭代的序列支持索引。因此,如果列表中有重复项(或索引不支持序列),请使用枚举方法。

根据循环体的不同,负切片方法 1 或 2 可能会导致代码更简单,并且它们的性能接近。

原文由 Mattwmaster58 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题