2011-01-08 51 views
3

我已經閱讀了這個answer,這可能是在Python中隨機化字符串列表的最佳方式。我只是想知道,然後如果這是這樣做的最有效的方式,因爲我通過下面的代碼具有約3000萬的元素列表:Python中數百萬元素的隨機列表高效

import json 
from sets import Set 
from random import shuffle 

a = [] 

for i in range(0,193): 
    json_data = open("C:/Twitter/user/user_" + str(i) + ".json") 
    data = json.load(json_data) 
    for j in range(0,len(data)): 
     a.append(data[j]['su']) 
new = list(Set(a)) 
print "Cleaned length is: " + str(len(new)) 

## Take Cleaned List and Randomize it for Analysis 
shuffle(new) 

如果有一個更有效的方式來做到這一點,我d非常感謝關於如何做到這一點的任何建議。

感謝,

回答

4

幾個可能的建議:

import json 
from random import shuffle 

a = set() 
for i in range(193): 
    with open("C:/Twitter/user/user_{0}.json".format(i)) as json_data: 
     data = json.load(json_data) 
     a.update(d['su'] for d in data) 

print("Cleaned length is {0}".format(len(a))) 

# Take Cleaned List and Randomize it for Analysis 
new = list(a) 
shuffle(new) 

  • 要知道這是否更快的唯一方法是配置它!
  • 你喜歡sets.Set到內置set()的原因嗎?
  • 我已經介紹了一個with子句(打開文件的首選方式,因爲它保證它們被關閉)
  • 它似乎沒有做任何與'a'作爲列表,除了將它轉換爲一個集合;爲什麼不從一開始就讓它成爲一套?
  • ,而不是重複的索引,然後做索引查找,我只是重複的數據項目...
  • 這使得它很容易重寫作爲發電機表達
+0

謝謝你的建議,itervalues怎麼會因爲我以爲數據是一個列表工作?而不是一個字典 - 這似乎也是我運行它時的問題:'AttributeError:'list'object has no attribute'itervalues'' – eWizardII

+1

他的意思是'a.update(d ['su']代表數據中的d )'.itervalues'用於字典。基本上你沒有理由在這裏使用'range'。 – milkypostman

2

如果你認爲你將要進行洗牌,你可能會更好地使用該文件中的解決方案。對於realz。

randomly mix lines of 3 million-line file

基本上洗牌算法具有非常低的時期(這意味着它不能打的300萬個文件的所有可能的組合,更別說30元)。如果你可以在內存中加載數據,那麼你最好的選擇就像他們說的那樣。基本上給每一行分配一個隨機數字並對那個badboy進行排序。

看到這個話題。在這裏,我這麼做是爲了你,讓你沒惹任何東西(這是一個笑話),

import json 
import random 
from operator import itemgetter 

a = set() 
for i in range(0,193): 
    json_data = open("C:/Twitter/user/user_" + str(i) + ".json") 
    data = json.load(json_data) 
    a.update(d['su'] for d in data) 

print "Cleaned length is: " + str(len(new)) 

new = [(random.random(), el) for el in a] 
new.sort() 
new = map(itemgetter(1), new) 
+0

我寧願使用list.sort方法的「key」參數,而不是構建「new」,list ...類似於:new = sorted(a,key = lambda x:random.random()) – Bakuriu

+0

你的想法存在兩個問題,1)lambda非常慢,2)排序方法最終會按照我的建議進行。基本上,當你爲排序算法提供'key'時,它所做的就是創建'(key,object)'元組。 – milkypostman

相關問題