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

ned*_*004 10 python list python-3.x

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

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

我希望这个输出:

hello,
9,
3.14,
9
Run Code Online (Sandbox Code Playgroud)

但我得到这个输出:

hello, 
93.14, 
9
Run Code Online (Sandbox Code Playgroud)

我理解为什么我得到了我不想要的输出.我宁愿我仍然可以使用循环,但我可以解决它们.(我想用更复杂的代码来使用它)

Mar*_*ers 19

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

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
Run Code Online (Sandbox Code Playgroud)

enumerate()函数为每个元素添加一个计数器(参见枚举的含义是什么?),if i:除了0(第一个元素)之外,对于计数器的所有值都是如此.

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

print(*a, sep=',\n')
Run Code Online (Sandbox Code Playgroud)

sep值插入各参数之间(*a适用所有值a作为单独的参数,看看这是什么**(双星)和*(星号)的参数吗?).这比使用更有效,print(',n'.join(map(str, a)))因为这不需要首先构建一个全新的字符串对象.


Mat*_* M. 16

虽然这些答案可能适用于OP的具体情况,但我发现它们对于更广泛的应用并不令人满意.

以下是我在这里可以想到/看到的方法以及它们各自的时间.

指数法

urlist_len = len(urlist)-1
for x in urlist:
    if urlist.index(x) == urlist_len:
        pass
Run Code Online (Sandbox Code Playgroud)

负片法

for x in urlist:
    if x == urlist[-1]:
        pass
Run Code Online (Sandbox Code Playgroud)

枚举方法

urlist_len = len(urlist)-1
for index, x in enumerate(urlist):
    if index == urlist_len:
        pass
Run Code Online (Sandbox Code Playgroud)

以下是一些不同方法的时间安排:

??????????????????????????????????????????????????????????????????
?                       Timing Results (s)                       ?
??????????????????????????????????????????????????????????????????
? List size             ? 20 ? 200     ? 2000   ? 20000 ? 200000 ?
??????????????????????????????????????????????????????????????????
?                       ? 0  ? 0.0006  ? 0.051  ? 5.2   ? 560    ?
? Index Method          ?    ?         ?        ?       ?        ?
??????????????????????????????????????????????????????????????????
?                       ? 0  ? 0       ? 0.0002 ? 0.003 ? 0.034  ?
? Negative Slice Method ?    ?         ?        ?       ?        ?
??????????????????????????????????????????????????????????????????
? Enumerate Method      ? 0  ? 0.00004 ? 0.0005 ? 0.016 ? 0.137  ?
??????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

注意:值<10us舍入为0

正如您所看到的,索引方法总是较慢,并且随着列表大小的增加,它只会呈指数级变差.我认为没有任何理由使用它.在所有情况下,负片方法都是最快的,但如果列表中有重复项,则会给出误报.此外,负片方法要求您迭代的序列支持索引.因此,如果列表中有重复项(或不是索引支持序列),请使用快速但不是最快的枚举方法.


tldr:如果所有元素都是唯一的并且序列支持索引,则使用否定切片,否则枚举方法

  • 不确定它是否会产生很大的不同,但是您可以在循环外执行 `len(urllist)-1` 计算以提高 `index` 和 `enumerate` 方法的性能 (3认同)

sko*_*kin 8

如果您真的只想将元素加入到逗号+换行符分隔的字符串中,那么使用str.join方法会更容易:

elements = ['hello', 9, 3.14, 9]
s = ',\n'.join(str(el) for el in elements)
# And you can do whatever you want with `s` string:
print(s)
Run Code Online (Sandbox Code Playgroud)


Shi*_*ana 5

您没有得到预期的输出,因为在您的代码中您说:“嘿,python,如果当前元素不等于最后一个元素,则打印一个逗号。”

第二个元素 9 等于最后一个元素,因此不打印逗号。

检查最后一个元素的正确方法是检查 element 的索引:

a = ['hello', 9, 3.14, 9]
for item in a:
    print(item, end='')
    if a.index(item) != len(a)-1: #<--------- Checking for last element here
        print(', ')
Run Code Online (Sandbox Code Playgroud)

(此外,这可能会引发值错误。您也应该检查一下。)