繁体   English   中英

如何为包含特定字符串的列表中的每个唯一元素创建[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])中获取所有唯一元素。

假设我在“唯一”列表中有〜1000个元素,对于每个唯一元素,我试图在“主列表”中随机查找5个元素,这些元素包含mainlist [i] [0]中的unique [i]数量。 对于每次匹配,主列表的两个字段/字符串都应附加到新列表“ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM