反向配对两个列表

时间:2018-07-21 15:14:05

标签: python

我想要做的是选择列表A中的一项,然后选择列表B中的另一项,将它们配对:

A[0]+B[n], A[1]+B[n-1],.....,A[n]+B[1]

我使用了两个for循环,但是没有用:

class Solution(object):
def plusOne(self, digits):
    sum=0
    for j in range(len(digits)-1,0,-1) :
        for i in range(0,len(digits),1):
            sum=sum+digits[i]*pow(10,j)
    return sum+1

我输入了[1,2,3],我想得到的是124, 但我得到了661

编辑:

对不起,我上面给出的示例不清楚。

让我们考虑一下A[1,2,3]B[6,5,4]

我想要输出[5,7,9],因为51+472+593+6

3 个答案:

答案 0 :(得分:3)

您要执行的操作是将数字列表转换为相应的数字(并添加1)。您可以enumerate反转列表,以便将一个数字与其10的适当功效配对:

digits = [1, 2, 3]
sum(10**i * y for i, y in enumerate(digits[::-1])) + 1
# 124

您可以使用zip将其应用于其他示例,如下所示:

A = [1,2,3]
B = [6,5,4]
sum(10**i * (x+y) for i, (x, y) in enumerate(zip(B, A[::-1])))
# 579

答案 1 :(得分:3)

您可以无循环执行此操作:

A = [1,2,3]
B = [6,5,4]

C = list(map(sum,zip(A,B[::-1]) ))

print(C)

zip()-创建所有可迭代元素的成对,然后将其AB倒转(通过切片)。然后,您将每一对加起来并从这些总和中创建一个列表。

map( function, iterable)-将函数应用于可迭代的每个元素

zip()在两个列表的长度相同时起作用,否则您将需要使用0默认值为itertools.zip_longest()

K = [1,2,3,4,5,6]
P = list(map(sum, zip_longest(K,C,fillvalue=0)))

print(P)

输出:

[5, 7, 9]   # zip of 2 same length lists A and B reversed
[6, 9, 12, 4, 5, 6]   # ziplongest for no matter what length lists

答案 2 :(得分:2)

  1. 如果要在同一列表中来回搜索或以相同长度(i和len(lst)-1-i)搜索不同列表,则只需要一个循环。

  2. 请尽量不要将sumlisttuplestrint等内置变量用作变量名,它会给在某些情况下会给您带来一些讨厌的结果。

    class Solution(object):
        def plusOne(self, digits):
            sum_val = 0
            for i in range(len(digits)):
                sum_val += digits[i]*pow(10, len(digits)-1-i)
            return sum_val+1
    
    sol = Solution()
    dig = [1, 2, 3]
    print(sol.plusOne(dig))
    

输出:

124

A = [1, 2, 3]B = [6, 5, 4]

您可以使用列表理解:

res = [A[i]+B[len(A)-i-1] for i in range(len(A))]

或使用zip()函数和列表理解:

res = [a+b for (a, b) in zip(A, reversed(B))]

结果:

[5, 7, 9]