【问题标题】:How do I remove the last 2 characters of an element in a list?如何删除列表中元素的最后 2 个字符?
【发布时间】:2013-02-15 05:50:27
【问题描述】:

我正在尝试删除以下列表中每个项目的最后 2 位数字。

keys = ['2013', '1101', '1201', '1301', '1401', '1402', '1403', '2100', '2150', '3201', '5201', '5301', '9810', '9820', '9830', '2013', '1101', '1201', '1202', '1301', '1304', '1401', '1402', '1403', '2100', '2150', '3401', '5201', '5301', '9810', '9820', '9830', '2013', '1101', '5201', '2013', '1101', '1201', '1401', '1402', '1403', '2100', '5201', '5301', '5402', '9810', '9820', '9830', '2013']

for n,k in keys:
  keys[n] = keys[n][0]+keys[n][1]

我不断收到 ValueError: too many values to unpack

【问题讨论】:

  • 附带说明,如果您执行for n,k in enumerate(keys):,您的代码也可以工作

标签: python python-2.7


【解决方案1】:

这里不需要正则表达式...简单的切片就可以了:

keys = [k[:-2] for k in keys]

这实际上并没有到位,但它可以很容易地到位:

keys[:] = [k[:-2] for k in keys]

【讨论】:

  • “但它可以很容易地就位” - 我想你应该说如何:)
  • keys[:] 行为就像它已经到位并且功能上看起来像它——但是it is not
  • @Pyson -- 这是一个非常小的挑剔。我正在更改keys,即使我正在创建一个中间列表来这样做。当然,您可以将其更改为生成器表达式,但是当内存通常不是问题时,我碰巧喜欢语句中的对称性。实际上,您发布的那个链接并没有说明密钥列表是否已就地修改。它只谈论以这种方式执行此操作所涉及的额外内存。如果内存确实是个问题,请使用循环(或 rhs 上的 genexp 和不首先使其成为元组的 python 实现)
  • 如果内存不足,这不是小问题。阅读源代码。即使您将其更改为生成器,也会在分配给 keys[:] 之前生成完整的中间元组
  • @Pyson -- 使用 Cpython,但不能保证其他 python 实现的行为相同。我只是说这实际上是更新keys 列表就地 的一种方法。这不是最节省内存的方法,但说keys[:] = 不合适是错误的。
【解决方案2】:

您收到一个错误,因为keys 是一个长度为 4 的字符串列表,所以

for n,k in keys:

无法工作,因为长度为 4 的字符串无法解压缩到 2 变量 nk

不管怎样,这是另一种选择:

map(operator.itemgetter(slice(-2)), keys)

【讨论】:

  • 感谢挖掘slice。当这奏效时,我真的很惊讶。我会写map(itemgetter(slice(None,-2)),keys),我相信它也会奏效。
  • 此外,您可以对字符串使用序列解包,就像对列表或元组一样。 (字符串毕竟是序列)。这就是为什么 OP 得到“ValueError: too many values to unpack”而不是“TypeError: ... is not iterable”
  • 很好的修订。 +1 用于解释引发的实际异常。
猜你喜欢
  • 2014-04-23
  • 1970-01-01
  • 2021-11-27
  • 2018-03-10
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
相关资源
最近更新 更多