【问题标题】:Python one liner to substitute a list indicesPython 一个内衬来替换列表索引
【发布时间】:2016-05-16 15:50:47
【问题描述】:

我想用list2 元素替换那些索引存储在列表indices 中的list1 元素。以下是当前代码:

j=0
for idx in indices:
   list1[idx] = list2[j]
   j+=1

是否可以使用 lambda functionlist comprehension 为上述四行编写单行代码?

编辑
list1包含浮点值
list2包含浮点值
indices包含0len(list1)之间的整数

【问题讨论】:

  • 不,列表推导不能修改现有列表。
  • 您能举例说明list1list2incides 将包含哪些内容吗?
  • @MorganThrapp 创建新列表的选项是open
  • @MorganThrapp 这是不好的做法,但他们可以:x = [0, 0, 0]; [x.__setitem__(i, 5) for i in range(3)]; print(x) 会打印 [5, 5, 5]
  • @OrangeFlash81 我的意思是,是的,你可以这样做。如果你在生产代码中这样做,我会伤害你。

标签: python


【解决方案1】:

使用conditional expressions

# A test case
list1 = [0, 1, 2, 3, 4, 5, 6]
list2 = ['c', 'e', 'a']
indices = [2, 4, 0]

# Use conditional expressions
new_list = [list2[indices.index(idx)] if idx in indices else v for idx, v in enumerate(list1)] # idx2 = indices.index(idx), for list2

print(new_list)
# Output
['a', 1, 'c', 3, 'e', 5, 6]

【讨论】:

  • 嗨,这个看起来不太对。为什么选择list2idx 条目? list1[idx] 条目将被替换为 list2 条目(以串行方式)。
  • @vvy,谢谢,我用一个例子编辑了我的答案。结果和你原来的代码一致。
【解决方案2】:

虽然它不是一个单行,但这里有一个我认为更具可读性的替代方案:

for i, v in zip(indices, list2):
    list1[i] = v

【讨论】:

  • 当然,如果您将list1[i] = v 移动到与for 循环相同的行,那么它将是1 行,这绝对是最干净的答案!
【解决方案3】:

它不是那么漂亮,但你可以这样解决它:

map(list1.__setitem__, indices, list2)

【讨论】:

  • 虽然聪明,但 PEP 20 可能会反对。
  • 我同意你们的观点,但 OP 要求提供“一个班轮”,我交付了 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 2021-04-14
  • 2013-08-26
  • 2016-04-03
  • 2021-05-13
  • 1970-01-01
相关资源
最近更新 更多