【问题标题】:Python: how to copy between lists using lists, e.g. list1[index1] = list2[index2]Python:如何使用列表在列表之间复制,例如列表 1[索引 1] = 列表 2[索引 2]
【发布时间】:2019-12-23 10:39:39
【问题描述】:

假设我们有两个值列表list1list2,以及两个索引列表index1index2。我们如何将list2 中位置为index2 的元素复制到list1 中位置为index1 的元素。例如,在 Matlab 中,我们可以简单地写成list1[index1] = list2[index2],但奇怪的是这在 Python 中似乎不起作用。另外,如果index1 和/或index2 是布尔值列表,我们该怎么做?

例如,说list1 = ['a','b','c','d','e']list2 = ['A','B','C','D','E']index1 = [0,1,3]index2 = [1,2,4],结果list1[index1] = list2[index2]list1: ['B','C','c','E','e']

对于布尔值,应使用index1 = [True,True,False,True,False]index2 = [False,True,True,False,True] 实现相同的输出。

PS:很清楚如何使用for 循环来做到这一点。我正在寻找一种更“pythonic”的方式,例如列表理解。谢谢

PPS:经过一些实验,我定义了一个类 MyList,它继承自 Python 类的 list,并修改了 __getitem____setitem__ 以接受整数或布尔值列表。类定义在我的帖子中给出How to extend list class to accept lists for indecies in Python, e.g. to use list1[list2] = list3[list4]

【问题讨论】:

  • 只要确保两个列表的长度相同(或者目标列表更长)——你不能用i[8] = 42 来替换i = [0,1],因为没有第8 个元素可以替换。如果您从包含列表引用的列表中复制引用,还要注意列表的可变性质。在这种情况下,您不会创建不同的新列表
  • 如果 index1 和/或 index2 是布尔值列表,您确定将 list2 中的哪个元素复制到 list1
  • @Austin 我当然试过了。我收到一个错误“TypeError:列表索引必须是整数或切片,而不是列表”
  • 嗯,我没有看到 index1index2 是列表。请提供示例输入以避免混淆。
  • @Austin list1[index1] 应该是 n 元素的子集,list2[index2] 也应该是 n 元素的子集,因此我们将后一个子集的值分配给前一个子集

标签: python python-3.x list


【解决方案1】:

您可以使用带有enumerate 的简单for 循环:

list1 = ['a','b','c','d','e']
list2 = ['A','B','C','D','E']
index1 = [0,1,3]
index2 = [1,2,4]

for i, val in enumerate(index1):
    list1[val] = list2[index2[i]]

print(list1)

输出:

['B', 'C', 'c', 'E', 'e']

或者使用zip:

list1 = ['a','b','c','d','e']
list2 = ['A','B','C','D','E']
index1 = [0,1,3]
index2 = [1,2,4]

for a, b in zip(index1, index2):
    list1[a] = list2[b]

print(list1)

输出:

['B', 'C', 'c', 'E', 'e']

据我所知,布尔大小写完全不同,应该在单独的问题中提出。

【讨论】:

    【解决方案2】:

    使用zip 并组合两个索引列表的元素。

    list1 = ['a', 'b', 'c', 'd', 'e']
    list2 = ['A', 'B', 'C', 'D', 'E']
    index1 = [0, 1, 3]
    index2 = [1, 2, 4]
    
    for i1, i2 in zip(index_1, index_2):
        list1[i1] = list2[i2]
    
    print(list1)
    

    【讨论】:

    • 这个句柄 index1 index2 可以是布尔值吗?
    • 不,它没有。使用布尔值,您可以得到一个具有不同含义的列表。
    【解决方案3】:
    list1 = ['a','b','c','d','e']
    list2 = ['A','B','C','D','E']
    index1 = [0,1,3]
    index2 = [1,2,4]
    x=0
    for i in index1:
        list1[i] = list2[index2[x]]
        x+=1
    print(list1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多