有条件地用两个列表替换项目

2024-10-06 15:29:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用同一索引中列表B中的元素替换列表A中的任何“-”实例。现在我的输出根本没有修改列表A,所以我怀疑我的for循环正在处理一个副本。在

A = [ ["dog", ["corgi",'-',"labrador"]], ["cat", ["tabby","persian",'-']] ]
B = ["BLANK 1","BLANK 2","BLANK 3"]
i = 0
for one,two in zip(A[i][1],B):
    if one == '-':
        one = two
    i += 1
print(A)

我希望我的输出(即修改后的列表A)如下所示:

^{pr2}$

非常感谢你们对我的指导!在


Tags: 实例元素列表for副本onecatblank
3条回答

是的,for循环只将zip()创建的从列表分配到变量one和{}。在

相反,你可以这样做:

for sublist in A:
    for index, value in enumerate(sublist[1]):
        if value == '-':
            sublist[1][index] = B[index]

由于列表是通过引用传递的,因此外部for循环分配的sublist仍将引用A引用的相同列表。在

为了执行如此复杂的操作,我们可以将其分解为更简单的操作。在最简单的层次上,我们希望用另一个字符串替换短划线(-):

>>> x = 'corgi'
>>> y = 'BLANK 1'
>>> x if x != '-' else y
corgi

>>> x = '-'
>>> y = 'BLANK 2'
>>> x if x != '-' else y
BLANK 2

下一步是将["corgi",'-',"labrador"]替换为["corgi",'BLANK 2',"labrador"]

^{pr2}$

最后,我们来看看全局:

>>> C = [ [animal,
      [x if x != '-' else y for x, y in zip(breed, B)] ]
      for animal, breed in A]

>>> print C
[['dog', ['corgi', 'BLANK 2', 'labrador']], ['cat', ['tabby', 'persian', 'BLANK 3']]]

您需要压缩整个列表,然后在循环中进行取消引用。在

for a, b in zip(A, B):
    a[1] = [B[i] if v == '-' else v for i, v in enumerate(a[1])]

相关问题 更多 >