2016-05-15 67 views
0

我想完成一個挑戰,我必須生成兩個隨機數列表,然後將列表中有共同名稱的數字拖入另一個沒有重複列表。我有一些工作,但我覺得它可以縮短。有沒有更好的方法給列表z和y分配一個隨機範圍?有沒有一種列表理解能起作用?尋找一個更短的方式來執行多個隨機數字分配

import random 
from random import randrange 

z = list(range(random.randrange(1,100,1))) 
y = list(range(random.randrange(1,100,1))) 

for i in range(len(z)): 
    z[i] = random.randint(1,1000) 

for i in range(len(y)): 
    y[i] = random.randint(1,1000) 


c = { item for item in z if (item in y)} 
print(c) 
+0

使用交集。它快得多。 –

回答

3

我會用random.sample對於和指定的號碼被採樣使用一個隨機整數:

y = random.sample(range(1, 1001), random.randint(1, 100)) 
z = random.sample(range(1, 1001), random.randint(1, 100)) 
set(y) & set(z) 
Out[35]: {51, 585, 968} 

作爲@Alan指出:對於Python 2,最好是作爲該範圍返回一個列表中使用的xrange而不是範圍。對於範圍(1000),這可能不是問題,但對於更大的範圍它可能會導致內存問題。你還應該注意到random.sample選擇沒有替換。如果你想選擇替換(所以數字可以重複),你可以使用列表理解作爲@DeepSpace did(當然,你不想將它轉換爲一個集合,所以在這種情況下使用[]而不是{})。

+0

Python 2 note(來自文檔):「要從整數範圍中選擇一個樣本,請使用xrange()對象作爲參數。」 一般說明(來自文檔):「用於無需更換的隨機抽樣。」原始示例採用替換進行採樣,無論是否有意或無意。 – Alan

+0

@Alan你在兩個賬戶上都是正確的。我會爲xrange添加一個註釋。對於替換,我認爲這並不重要,因爲OP最終使用了一個集合,但他們當然可能有興趣在其他地方使用這些列表。 – ayhan

0

您是否正在尋找? [random.randint(1,1000)因爲我在範圍內(100)]

0

你可以使用list comprehensions

import random 
from random import randrange 

z = [random.randint(1,1000) for x in range(100)] 
y = [random.randint(1,1000) for x in range(100)] 

c = set(y) & set(z) 
print(c) 
+0

這讓我在那裏。謝謝。 –

1

Python不是Java或C.您不需要先聲明列表,然後將每個元素初始化爲新對象。

你的整個代碼能夠被重構到:

set_a = {random.randint(1,1000) for _ in range(random.randint(1,1000))} 
set_b = {random.randint(1,1000) for _ in range(random.randint(1,1000))} 

common_list = set_a & set_b 
相關問題