簡體   English   中英

將數字的每個元素乘以數字

[英]Multiply every element of a list by a number

我希望將列表中的所有元素乘以數字。 我知道其他方法,但我想知道為什么這不起作用? 我得到了與輸出完全相同的列表。

lst = eval(input('enter a list'))
for num in lst:
     num = num * 2
print(lst)

這是不是因為工作,你使用for循環名單上並定義/更改num全局變量,而不是在元素lst列表。

例如:

>>> l = [1, 5, 8]
>>> for num in l:
...     num *= 2
...     
... 
>>> num
16
>>> l
[1, 5, 8]

在這種情況下,在第一個循環中, num1l的第一個元素),肯定1 * 2給出2

然后, num變為5因為5是列表中的第二個元素。 num * 2num變為10

在第二個for循環中,它變為8 * 2 16 它不會再次改變,因為for循環結束了。

但是,在此循環期間,您沒有更改列表的任何內容。 因為for獲取列表中的元素,並把它變成一個臨時變量

當您在for循環中更改該臨時變量時 ,您沒有更改列表中的任何內容。

好吧,既然你寫了“我知道其他方法,但我想知道為什么這不起作用?” ,這是你的答案:你只修改臨時循環變量num ,而不是列表本身。 嘗試這個:

for i, num in enumerate(lst):
     lst[i] = lst[i] * 2

你沒有改變lst的元素,這樣做:

for num in range(len(lst)):
    lst[num] *= 2
lst=eval(input('enter a list'))
lst=list(map(lambda num:num*2,lst))
print (lst)

你需要更新lst。

由於安全起見,最好使用ast.literal_eval然后使用eval 你可以在這里閱讀它。 你可以用列表理解來解決這個問題:

import ast
lst = ast.literal_eval(input('enter a list'))
lst = [num*2 for num in lst]
print(lst)

列表推導比使用lambda map更快。 時間安排

lst = list(range(1000))

In [56]: %timeit list(map(lambda num:num*2,lst))
10000 loops, best of 3: 169 us per loop

In [57]: %timeit [num*2 for num in lst]
10000 loops, best of 3: 80.5 us per loop

兩個干凈的表達:

In [360]: lst=list(range(10))

就地改變:

In [361]: for i,v in enumerate(lst):
   .....:     lst[i]=v*2
   .....:     
In [362]: lst
Out[362]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

生成一個新列表:

In [363]: [v*2 for v in lst]
Out[363]: [0, 4, 8, 12, 16, 20, 24, 28, 32, 36]

對於輸入,我更喜歡顯式拆分和轉換字符串:

In [365]: lst = [int(x) for x in input().split()]
10 11 0 1 2 
In [366]: lst
Out[366]: [10, 11, 0, 1, 2]

正如其他人所指出的那樣,正確的方法是通過索引到列表中:

myList = range(5)
for i in range(len(myList)):
    myList[i] *= 2
print myList #[0,2,4,..]

關於通過分配的一點點

您的循環使用for num in list表示法不會修改列表。 因為循環變量num在循環的每次迭代中都采用int類型的值,因為在python中int是不可變的(即它的值不能更改), num獲取整數值的副本。

當列表中的對象是可變的並通過引用傳遞時,這會發生變化。 考慮以下:

class X: 
    def __init__(self):
         self.val = 1

myList = [X() for i in range(5)]
print [element.val for element in myList] #1,1,1,1,1

for el in myList:
    el.val = 2

print [element.val for element in myList] #2,2,2,2,2 

現在,由於myList包含一個可變的X對象列表,因此循環變量el將一個引用復制到其中。 引用指向內存中的同一對象,原始myList中的引用指向該對象。 因此,當您使用循環變量更改對象時,原始myList中引用的對象也會更改。

這篇Pass By Reference更深入地討論了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM