3

我已经阅读了这个答案,这可能是在 Python 中随机化字符串列表的最佳方式。我只是想知道这是否是最有效的方法,因为我通过以下代码获得了大约 3000 万个元素的列表:

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)

如果有更有效的方法可以做到这一点,我将不胜感激有关如何做到这一点的任何建议。

谢谢,

4

3 回答 3

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”作为列表进行任何操作;为什么不从一开始就做一套呢?
  • 而不是迭代索引,然后查找索引,我只是迭代数据项......
  • 这使得它可以很容易地重写为生成器表达式
于 2011-01-08T03:09:56.017 回答
2

如果您认为要进行随机播放,最好使用此文件中的解决方案。对于真正的。

随机混合 300 万行文件的行

基本上,shuffle 算法的周期非常短(意味着它无法命中 300 万个文件的所有可能组合,更不用说 3000 万个)。如果您可以将数据加载到内存中,那么您最好的选择就是他们所说的。基本上为每一行分配一个随机数并对那个坏男孩进行排序。

看到这个线程。在这里,我为你做了,所以你没有搞砸任何事情(这是个玩笑),

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)
于 2011-01-08T04:43:40.577 回答
0

我不知道它是否会更快,但你可以尝试numpy's shuffle

于 2011-01-08T02:42:27.597 回答