如何为包含特定字符串(带有嵌套循环?)的列表中的每个唯一元素创建 [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