如何为包含特定字符串(带有嵌套循环?)的列表中的每个唯一元素创建 [n] 个元素的随机样本
How to create a random sample of [n] elements for each unique element in list containing a certain string(with nested-loops?)
我正在尝试创建一个包含随机样本(更具体地说,分层样本)的列表。
我的数据包含一个列表,其中包含数百万个电话号码(每个一个字符串),我将其拆分为一个包含 2 个字符串(每个号码)的列表。
第一个字符串是城市代码,必须根据它对样本进行分层。我用了
unique = list(set(citycode))
从主列表 (mainlist[0]) 中获取所有唯一元素。
假设我在列表 'unique' 中有大约 1000 个元素,对于每个唯一元素,我试图在 'mainlist' 随机 中找到 5 个元素,其中包含mainlist[i][0] 中 unique[i] 的数量。
对于每场比赛,主列表的 fields/strings 都应附加到新列表 'randomlist' 中。所以最终列表应该包含 5000 个电话号码。
我想为此使用嵌套循环,但由于我是 Python 的初学者并尝试使用在线教程自学,我还没有真正找到解决这个问题的函数或方法。
我不确定在这种情况下有什么可能的解决方法。
如有任何想法或意见,我们将不胜感激。
谢谢!
假设两个列表如下:
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
我正在尝试创建一个包含随机样本(更具体地说,分层样本)的列表。
我的数据包含一个列表,其中包含数百万个电话号码(每个一个字符串),我将其拆分为一个包含 2 个字符串(每个号码)的列表。 第一个字符串是城市代码,必须根据它对样本进行分层。我用了
unique = list(set(citycode))
从主列表 (mainlist[0]) 中获取所有唯一元素。
假设我在列表 'unique' 中有大约 1000 个元素,对于每个唯一元素,我试图在 'mainlist' 随机 中找到 5 个元素,其中包含mainlist[i][0] 中 unique[i] 的数量。 对于每场比赛,主列表的 fields/strings 都应附加到新列表 'randomlist' 中。所以最终列表应该包含 5000 个电话号码。
我想为此使用嵌套循环,但由于我是 Python 的初学者并尝试使用在线教程自学,我还没有真正找到解决这个问题的函数或方法。 我不确定在这种情况下有什么可能的解决方法。
如有任何想法或意见,我们将不胜感激。 谢谢!
假设两个列表如下:
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