我有一个功能:
def fun(l):
for i in l:
if len(i)==10:
l.append('+91 {} {}'.format(i[:5],i[5:]))
l.remove(i)
if len(i)==11:
j=list(''.join(i))
j.remove(i[0])
l.append('+91 {} {}'.format(''.join(j[:5]),''.join(j[5:])))
l.remove(i)
if len(i)==12:
j=list(''.join(i))
j.remove(i[0])
j.remove(i[1])
l.append('+91 {} {}'.format(''.join(j[:5]),''.join(j[5:])))
l.remove(i)
if len(i)==13:
j=list(''.join(i))
j.remove(i[0])
j.remove(i[1])
j.remove(i[2])
l.append('+91 {} {}'.format(''.join(j[:5]),''.join(j[5:])))
l.remove(i)
return l
说 l=['9195969878','07895462130','919875641230']
我得到的输出为
['+91 91959 69878','7895462130','+91 98756 41230']
但我想得到的输出为: ['+91 91959 69878','+91 78954 62130,'+91 98756 41230']
实际上,这个函数正在转义所有位于“l”列表中甚至没有定位的内容。请大家推荐一下
最佳答案
第一个问题是您在迭代列表时改变了列表。在这种特殊情况下,这会导致循环跳过一些项目,因为您删除了较早的项目。在其他 Python 版本中,它可能会触发错误。但是你正在返回你的结果,所以我根本不明白你为什么要改变列表。
其次,你的代码做了一些迂回的事情,特别是 ''.join(i)
,它绝对是多余的(它实际上重建了相同的字符串),以及一系列的remove()调用,这几乎肯定是多余的不要做你期望的事。如果从 [1,2,3] 中删除第一项,列表将变为 [2,3],如果您随后删除第二项(索引 1),则最终会得到 [2]。这与您的 for 循环与其他删除相同的问题。
我还会稍微重组代码以避免代码重复。我得到类似的东西:
def fun(l):
return ['+91 {} {}'.format(i[-10:-5],i[-5:])
for i in l]
这永远不会改变l
,只进行一次传递,并通过观察我们在距末端固定距离处使用的部分来连接所有不同长度的行为。有一个警告:其他长度不会单独处理。我不知道这些是否会发生,或者您实际上希望如何处理它们(旧代码会让它们保持原样)。我们可以很容易地指定其他行为:
def fun(l):
return ['+91 {} {}'.format(i[-10:-5],i[-5:]) if 10<=len(i)<=13
else i
for i in l]
这仍然不会重现在末尾附加重新格式化的数字的行为,但我不确定您是否真的想要这样做。循环首先处理自己的输出没有什么意义。
关于python - 不幸的是,即使是定位的数字也会被转义 python3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45709750/