我正在尝试创建一个包含随机样本的列表(更具体地说,是一个分层样本)。
我的数据包含一个包含数百万个电话号码的列表(每个电话号码为一个字符串),我将其拆分为包含2个字符串的列表(每个号码)。 第一个字符串是城市代码,样本必须通过该代码进行分层。我用了
unique = list(set(citycode))
从主列表中获取所有唯一元素(主列表[0])。
假设我在列表中有大约1000个元素,并且有独特的'对于每个独特的元素,我试图在'主列表'中找到5个元素。 随机,其中包含mainlist [i] [0]中唯一[i]的数量。 对于每个匹配,主列表的两个字段/字符串都应附加到新列表中,' randomlist'。所以最终名单应包含5000个电话号码。
我想过为此使用嵌套循环,但由于我是Python的初学者并尝试使用在线教程自学,我还没有找到解决这个问题的功能或方法。 在这种情况下,我不确定解决它的可行方法。
任何想法或意见都将不胜感激。 谢谢!
答案 0 :(得分:0)
假设有两个列表:
main = [(123, xxxxxxx),...]
unique = [123, ...]
然后你可以做类似的事情:
from random import shuffle
shuffle(main)
out = []
for u in unique:
i = 0
it = (x for x in main if x[0] == u)
while i < 5:
try:
out.append(main.pop(main.index(next(it))))
except:
pass
i+=1
out
将包含一个元组列表,如在main中找到的元组,每个唯一区域代码最多5个(如果main包含少于5个,则小于5),随机分布。
更新
由于你想要排除代表性太少的区号,所以你可以这样做:
from random import shuffle
from collections import Counter
c = Counter(x[0] for x in main)
main = [x for x in main if c[x] >= 5]
shuffle(main)
out = []
for u in unique:
i = 0
it = (x for x in main if x[0] == u)
while i < 5:
out.append(main.pop(main.index(next(it))))
i+=1