即使定位的数字也不幸地被逃脱了

时间:2017-08-16 09:22:27

标签: python python-3.x

我有一个功能:

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'名单。请建议

2 个答案:

答案 0 :(得分:1)

第一个问题是你在迭代它时改变了列表。在这种特殊情况下,这会导致循环跳过某些项目,因为您删除了之前的项目。在其他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]

这仍然没有重现最终附加重新格式化数字的行为,但我不确定你真的想要那个。首先,循环处理自己的输出没什么意义。

答案 1 :(得分:0)

您正在修改列表l - 我建议您创建一个新列表并将内容添加到此列表中。您是否有理由要进行变异?

如果您打算进行变异,为什么不做这样的事情?

l[index] = '+91 {} {}'.format(i[:5],i[5:])

此外,这是“python电话号码库”的第一个谷歌搜索结果:https://github.com/daviddrysdale/python-phonenumbers因为它可能对您有用。 (从未使用它,不是维护者。)