2017-06-20 70 views
0

正如標題所暗示的那樣,我想填充兩個單獨的列表,每個列表都有自己的隨機長度和使用列表理解的內容,如下所示:使用列表理解填充隨機數的兩個數組,使用列表理解

a, b = [random.randint(1,100), random.randint(1,100) for x in range(random.randrange(1,10))] 

它可以在一行中完成嗎?如果是的話,我該怎麼辦呢?

謝謝

+0

我很欣賞這個反饋,但是爲什麼比a更有用:「不,你不能」。你能否詳細說明爲什麼不應該或不能做到? 謝謝你 – Wretch11

+0

正如你在你的問題中所說的,「我想填充兩個__separate__列表,[...]」(emph mine),所以把它分成兩個語句(即兩行)更加清楚。把它放在一條線上是沒有好處的。 –

回答

1

首先,你想重複兩次相同的功能,而不是分別創建兩個數組。所以,讓我們寫一個函數random_array

現在,我們可以使用random.choice(range(int))來選擇一個隨機數,例如,

>>> choice(range(10)) 
7 

或者,我們可以使用random.randint(0, 10)太:

>>> random.randint(0, 10) 
5 

然後,我們可以隨機選擇N無。使用random.sample給出一個整數範圍:

>>> n = 5 
>>> random.sample(range(10), n) 
[3, 2, 1, 9, 4] 

因此,使用random.samplerandom.choice

>>> from random import sample, choice 
>>> def random_array(maxsize, maxint): 
...  return sample(range(maxint), choice(range(maxsize))) 
... 
>>> random_array(10, 100) 
[12, 9, 62, 48, 11, 44, 58, 52, 1] 
>>> random_array(10, 100) 
[97, 78, 33, 3] 

或者random.randintrandom.sample

>>> from random import randint, sample 
>>> def random_array(maxsize, maxint): 
...  return sample(range(maxint), randint(0, maxsize)) 
... 
>>> random_array(10, 100) 
[27, 50, 95, 18, 4, 30, 73, 47] 

或者使用numpy

>>> import numpy as np 
>>> np.random.rand() # Random float between 0.0 to 1.0 
0.7796560918112618 
>>> np.random.rand(2) 
array([ 0.75680381, 0.20146147]) 
>>> np.random.rand(2) # Random array of size 1x2 (column X row) 
array([ 0.81612505, 0.42277987]) 

>>> np.random.rand(random.randint(0, maxsize)) # Random size array of len < maxsize 
array([ 0.83846215, 0.77637599, 0.85086381, 0.03674837]) 
>>> np.random.rand(random.randint(0, maxsize)) # Random size array of len < maxsize 
array([ 0.26468399, 0.0472708 , 0.83615985, 0.20740113, 0.40436625, 
     0.84332336, 0.48814732, 0.39267764, 0.30662132]) 
>>> np.random.rand(random.randint(0, maxsize)) * 100 # Random size array of len < maxsize and max value < 100 
array([ 80.85771169, 50.49196633, 21.01646636, 36.15074652, 
     97.98209728, 85.68512275, 58.06013557, 23.93219465, 
     5.18467685, 12.77761391]) 

如果你想有一個單排:

a = sample(range(100), choice(range(10))) 
+0

謝謝你的回答,但是如果我真的想在一行中做到這一點,是否可以這樣做: 'a,b = [random.randint(1,100)randrange(1,10))],[random.randint(1,100)for x in range(random.randrange(1,10))]'? – Wretch11

+1

爲什麼你不想要一個功能?你可以產生無限的號碼。沒有硬編碼的陣列=) – alvas

+0

因爲這不是實際使用。我只是在做一些基本的Python練習,並希望儘可能縮短練習時間。 – Wretch11

0

如果你真的想在一行中創建不同的列表,然後你指的是一個嵌套列表:

import random 

l = [[random.randint(1, 100) for b in range(random.randint(1, 100))] for i in range(2)] 

然而,如果您只是想要兩個單獨的列表,則需要兩行:

l1 = [random.randint(1, 100) for b in range(random.randint(1, 100))] 

l2 = [random.randint(1, 100) for b in range(random.randint(1, 100))] 
+0

我覺得你很接近。它可以是'a,b = [[random.randint(1,100)爲範圍內的b(random.randint(1,100))] i爲範圍(2)]' – user3764893

0

製造是這樣工作的

a, b = [random.randint(1,100) for x in range(random.randrange(1,10))], [random.randint(1,100) for x in range(random.randrange(1,10))] 

根據上面的一些評論,這可能不是一個好主意。任何人都在意解釋爲什麼這是什麼?

+1

'可讀性比事情進展空間較小。如果我想要,我可以在一行上編寫整個程序 - https://onelinepy.herokuapp.com/ –

+2

你在問爲什麼這不是一個好主意。因爲閱讀起來要困難得多。你正在嘗試做兩件獨立的事情,所以他們應該分開行。此外,這會打亂線條的長度,再次使閱讀變得更加困難(順便說一下[PEP 8](https://www.python.org/dev/peps/pep-0008/#maximum- line- length )表示最大線長度爲79)。有兩條線是沒有缺點的,所以它是相反的,你應該證明爲什麼要把它放在一條線上。將兩個版本與您的VCS相鄰進行比較時,會出現短線的優勢。 –

+0

我明白了,謝謝! – Wretch11