Python-比较两个列表并更新第三个列表

Python-比较两个列表并更新第三个列表,python,python-3.x,list,Python,Python 3.x,List,嗨,我不是Python的熟练用户,我偶然发现了这个问题。我有以下3个列表(ss1不能有负数,g1和w1可以取值>=0): g1 = [2,0,1,1] w1 = [1,0,3,1] ss1 = [33, 45, 66, 54] 在我的玩具示例中,我想比较列表中的元素顺序的第一个元素g1和w1例如g1[0]==w1[0],如果这为真我们将g1[0]*2相乘,并将上一次操作的和加到ss1(ss1[0]+=g1[0]*2),如果g1[0]!w1[0]我们想取g1[0]和w1[0]之间的绝对差,用减号

嗨,我不是Python的熟练用户,我偶然发现了这个问题。我有以下3个列表(ss1不能有负数,g1和w1可以取值>=0)

g1 = [2,0,1,1]
w1 = [1,0,3,1]
ss1 = [33, 45, 66, 54]
在我的玩具示例中,我想比较列表中的元素顺序的第一个元素g1w1例如
g1[0]==w1[0]
,如果这为真我们将
g1[0]*2
相乘,并将上一次操作的和加到
ss1(ss1[0]+=g1[0]*2)
,如果g1[0]!
w1[0]
我们想取
g1[0]
w1[0]
之间的绝对差,用减号
w1[0]=-abs(g1[0]-w1[0])
和此操作的结果添加到
ss1
ss1[0]+=w1[0]

我想出了一个天真的解决办法:

if  g1[0] == w1[0]:
    ss1[0] += g1[0]*2
else:
    w1[0] = -abs(g1[0] - w1[0])
    ss1[0] += w1[0]
print(ss1)
if  g1[1] == w1[1]:
    ss1[1] += g1[1]*2
else:
    w1[1] = -abs(g1[1] - w1[1])
    ss1[1] += w1[1]
print(ss1)
if  g1[2] == w1[2]:
    ss1[2] += g1[2]*2
else:
    w1[2] = -abs(g1[2] - w1[2])
    ss1[2] += w1[2]
print(ss1)
if  g1[3] == w1[3]:
    ss1[3] += g1[3]*2
else:
    w1[3] = -abs(g1[3] - w1[3])
    ss1[3] += w1[3]
print(ss1)
所需的输出是
[32,45,64,56]

我正在考虑使用枚举器来解决这个问题


我想帮助我如何以更有效的方式做这件事,并将其转化为功能。如何构建一个循环来迭代和比较每个元素,并考虑添加操作。欢迎您提出解决方案。如果我对大量的列表有同样的问题(例如,我有相同的三胞胎g2、ww2、ss2),那么解决方案是什么

您可以通过
列表理解
执行此操作

ss1 = [(z+(x*2)) if x == y else (z-abs(x - y)) for x,y,z in zip(g1,w1,ss1)]
结果

[32, 45, 64, 56]

您可以通过
列表理解
执行此操作

ss1 = [(z+(x*2)) if x == y else (z-abs(x - y)) for x,y,z in zip(g1,w1,ss1)]
结果

[32, 45, 64, 56]

这可以通过这样一个简单的循环来解决

In [16]: for i,(a,b) in enumerate(zip(g1,w1)):
    ...:     if a == b:
    ...:         ss1[i] += a*2
    ...:     else:
    ...:         ss1[i] += -abs(a-b)
    ...:         
    ...:         

In [17]: ss1
Out[17]: [32, 45, 64, 56]

这可以通过这样一个简单的循环来解决

In [16]: for i,(a,b) in enumerate(zip(g1,w1)):
    ...:     if a == b:
    ...:         ss1[i] += a*2
    ...:     else:
    ...:         ss1[i] += -abs(a-b)
    ...:         
    ...:         

In [17]: ss1
Out[17]: [32, 45, 64, 56]
输出:

[32, 45, 64, 56]
输出:

[32, 45, 64, 56]

下面是一些完成您设置的代码。它使用您的if/else代码和相同的列表。它也是一个供您使用的函数,我将在代码中演示如何使用它:

#The function:

#Input array so function can return all lists
def compare(array):
    #Assign values to specific arrays again
    g1 = array[0]
    w1 = array[1]
    ss1 = array[2]

    #Use length of one array as all are the same length
    count = 0
    while count < len(g1):
        if  g1[count] == w1[count]:
            ss1[count] += g1[count]*2
        else:
            w1[count] = -abs(g1[count] - w1[count])
            ss1[count] += w1[count]

        #Count up till end of arrays
        count += 1

    #Return modified arrays
    array[0] = g1
    array[1] = w1
    array[2] = ss1
    return array

下面是一些完成您设置的代码。它使用您的if/else代码和相同的列表。它也是一个供您使用的函数,我将在代码中演示如何使用它:

#The function:

#Input array so function can return all lists
def compare(array):
    #Assign values to specific arrays again
    g1 = array[0]
    w1 = array[1]
    ss1 = array[2]

    #Use length of one array as all are the same length
    count = 0
    while count < len(g1):
        if  g1[count] == w1[count]:
            ss1[count] += g1[count]*2
        else:
            w1[count] = -abs(g1[count] - w1[count])
            ss1[count] += w1[count]

        #Count up till end of arrays
        count += 1

    #Return modified arrays
    array[0] = g1
    array[1] = w1
    array[2] = ss1
    return array

您不需要使用zip两次。只需在zip(g1、w1、ss1)中为x、y、z编写
@Rahul K P。感谢您的解决方案,它非常优雅。列表理解的结果是否可能发生在ss1中。我的意思是更新到ss1的值是否应该重新分配?@vasiop,您可以将结果重新分配到ss1。@Rahul K P谢谢您的帮助,我非常感谢您的解决方案。我无法表达我对你的感激之情:)。再次感谢你,伙计。你不需要用拉链两次。只需在zip(g1、w1、ss1)中为x、y、z编写
@Rahul K P。感谢您的解决方案,它非常优雅。列表理解的结果是否可能发生在ss1中。我的意思是更新到ss1的值是否应该重新分配?@vasiop,您可以将结果重新分配到ss1。@Rahul K P谢谢您的帮助,我非常感谢您的解决方案。我无法表达我对你的感激之情:)。再次感谢你,伙计。如果我让5个相同的三元组作为一个例子,我需要在你的解决方案中添加额外的If语句。例如g2、w2、ss2、g3、w3、ss3。我说的对吗?你把我弄糊涂了!你说的“五个三胞胎和一个三胞胎一样”是什么意思?是的,如果你想要的不是你最初要求的东西,你可能需要不同的代码。如果我让5个相同的三元组作为一个例子,我需要在你的解决方案中添加额外的if-staments。例如g2、w2、ss2、g3、w3、ss3。我说的对吗?你把我弄糊涂了!你说的“五个三胞胎和一个三胞胎一样”是什么意思?是的,如果你想要的不是你最初要求的东西,你可能需要不同的代码。感谢帮助尼斯解决方案。感谢帮助尼斯解决方案。感谢帮助和解决方案。感谢帮助和解决方案。