繁体   English   中英

两个列表的按元素乘法

[英]Element-wise multiplication of two lists

我正在尝试编写一个包含两个列表并返回一个列表的程序,该列表是每个列表中两个参数的逐个元素相乘。
如果列表长度不同,则返回的列表长度应与两者中的较短者相同。 这是我写的:

s = raw_input("Enter the first list:")
c = list(s)
c = s.split()
c = map(int, c)

t = raw_input("Enter the second list:")
d = list(t)
d = s.split()
d = map(int, d)

def multiply(c, d):
    cd = [ ]
    for i in range(0, len(c)):
    cd.append(c[i]*d[i])

通常的想法是,用户输入数字,然后将其转换为整数列表。 但是,存在无法将多个字符串与整数和“以10为底的int()无效文字”的错误。 我已经为此工作了两个小时,我不知道该怎么办!!! 请帮忙!

您可以尝试使用乘法运算符进行映射!

>>> from operator import mul
>>> map(mul,c,d)

例!

>>> from operator import mul
>>> c
[1, 2, 3]
>>> d
[1, 2, 3]
>>> map(mul,c,d)
[1, 4, 9]

希望这可以帮助!

您可以使用本文中提到的列表理解和zip混合。 请参考此链接

我认为您的代码中存在一些拼写错误,它应该像这样:

s = raw_input("Enter the first list:")
c = s.split()
c = map(int, c)

t = raw_input("Enter the second list:")
d = t.split()
d = map(int, d)

#if you want align two lists,try this:
if len(d)<len(c):
    d.extend([1]*(len(c)-len(d)))
elif len(d)>len(c):
    c.extend([1] * (len(d) - len(c)))
else:
    pass
#you will get c [2,3,1,1,1]  d[4,5,2,6,7]

cd = []
def multiply(c, d):
    for i in range(0, len(c)):
        cd.append(c[i]*d[i])

multiply(c, d)

print cd

或者,您可以尝试以下操作:

lista=raw_input("list a")

listb=raw_input("list b")


print [a*b for a,b in zip(map(int,lista.split()),map(int,listb.split()))]

让我们对代码进行一些处理,使其更易于理解。 您不小心输入了错误的输入等。

s = raw_input("Enter the first list:")
c = s.split()
c = list(map(int, c))

t = raw_input("Enter the second list:")
d = t.split()
d = list(map(int, d))

def multiply(c, d):
    cd = [ ]
    for i in range(0, len(c)):
        cd.append(c[i]*d[i])
    return cd

print multiply(c, d)

但是,当然,您可以像其他答案所说的那样,使用列表理解功能以一行或多种pythonic方式进行操作。

让我们一次迈出这一步。

首先,我们知道我们需要从用户那里读入两个数字列表。 为了简单起见,让我们假设用户可以通过输入一个或多个以空格分隔的值来完整列出数字。 例如。

1 2 3 4 5

既然我们已经定义了输入的方式,我们就可以正确地解析它了。 为此,我们将首先使用.split()将输入拆分为字符串列表,然后使用列表.split()将每个字符串转换为实际数字。 但是由于必须两次使用此逻辑,因此将其封装在一个名为get_numbers()的函数中:

def get_numbers():
    numbers = input("Enter some numbers: ").split()
    return [int(n) for n in numbers]

现在,我们可以使用新功能从用户那里收集两个数字列表。 我将命名第一个列表list1和第二个list2

list1 = get_numbers()
list2 = get_numbers()

现在,我们已经解决了将用户输入放入列表的问题,我们可以将注意力转向问题的第二部分:

返回单个列表,该列表是每个列表中两个参数的逐元素相乘。 如果列表长度不同,则应返回一个长度与两者中较短者相同的列表。

让我们首先满足第一个需求,然后再处理第二个需求。

我们知道我们需要成对地从两个列表中抓取每个元素的第n个元素,将它们多个在一起,然后将结果放入一个新的列表中。 为了完成成对遍历列表的任务,我们可以使用zip() 同样,我们将使用列表推导而不是常规的for循环:

[a * b中的a,b用zip(list1,list2)表示]

现在,我们也将其包装在一个函数中以zip_and_multiply()功能,并将其zip_and_multiply()

def zip_and_multiply(list1, list2):
    return [a*b for a, b in zip(list1, list2)]

但是,在没有意识到的情况下,我们还满足了我们的第二个要求( “如果列表的长度不同,则它应返回的长度等于两个中较短的一个。” )。

您会看到,如果给zip()两个不同长度的列表,它将在两个列表中最短的列表的末尾停止压缩,因此,它完全可以满足第二个要求。

剩下要做的就是打印在list1list2 (变量)上使用的zip_and_multiply()的结果:

print zip_and_multiply(list1, list2)

编写完所有上述代码(phew!)后,最终我们的最终程序将是(请注意,其顺序与上面代码的显示顺序不同):

def get_numbers():
    numbers = input("Enter some numbers: ").split()
    return [int(n) for n in numbers]

def zip_and_multiply(list1, list2):
        return [a*b for a, b in zip(list1, list2)]

list1 = get_numbers()
list2 = get_numbers()

print zip_and_multiply(list1, list2)

然而,应该注意的是,上述代码缺少所述程序中通常存在的许多代码部分,例如适当的错误处理。

首先, 列表理解是解决问题所需要的。 现在让我们解决您的问题-

从用户那里获取输入 -

“无法使用整数对多个字符串进行错误处理”

问题,假设您正在处理整数值,则需要确保列表中的所有值均为int类型。 您可以使用户输入值并将其映射到int类型,以使用-

user_input = map(int,raw_input(“输入第一个列表:”)。strip()。split(''))

这将从用户处使用空格分隔的整数并将其转换为列表。

现在

“以10为基数的int()的无效文字”

您需要确保在从用户处获取输入时仅输入整数。 如果用户提供字符串或空响应,则将抛出此错误。

将两个列表相乘-将列表相乘会出现以下情况:

1.两个列表的长度相同。

2.两个列表的长度不相等。

您需要检查列表的长度,如果长度不同,则将两个列表中的元素相乘,直到用完较小列表中的元素,然后追加较大列表中的其余元素。 以下是您的问题陈述的代码段-

c = map(int, raw_input('Enter First List').strip().split(' '))
d = map(int, raw_input('Enter Second List').strip().split(' '))

answer = [c[i]*d[i] if i<min(len(c), len(d)) else (c[i] if \
len(c)>len(d) else d[i]) for i in xrange(max(len(c), len(d)))]

答案将包含所需的结果集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM