簡體   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