簡體   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