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:如果所有元素都是唯一的并且序列支持索引,则使用否定切片,否则枚举方法
如果您真的只想将元素加入到逗号+换行符分隔的字符串中,那么使用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)
您没有得到预期的输出,因为在您的代码中您说:“嘿,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)
(此外,这可能会引发值错误。您也应该检查一下。)
| 归档时间: |
|
| 查看次数: |
25793 次 |
| 最近记录: |