繁体   English   中英

从Python中的列表中提取随机子列表

[英]Extracting a random sublist from a list in Python

我有一个python字典如下:

{'APPLE_PROVIDERS' : ["some", "provider","can","be", "null"],
  ....
}

我想要做的是从密钥的列表(这是一个值)中获取一个随机子列表。 不仅仅是一个元素,而是一个完全随机的子列表。 这是我尝试过的:

a_list = a_dict.get('APPLE_PROVIDERS', "")
for item in a_list[randrange(0,len(a_list)) : randrange(0,len(a_list))]:
  ...do something.. 

这件事有两个问题:

  1. 如果列表为空,或者dict查找失败,程序将失败,因为randrange有(0,0)作为参数,这会导致错误

  2. 很多时候,两个randrange()调用都会生成相同的数字,尤其是当列表很小时。 这将返回一个空列表。 例如a_list [5:5]

那么,处理上述案例的随机子列表的最佳方法是什么? 另外,我不关心订购。 一切正常。 每次for循环开始时,我只想要一个完全随机的子列表0,1 ...直到len(a_list)元素。

如果列表可以在其他一些可以容纳类似元素的数据结构中进行更改,那么这对我也有用。

取样吧。

>>> random.sample(["some", "provider", "can", "be", "null"], 3)
['some', 'can', 'provider']
>>> random.sample(["some", "provider", "can", "be", "null"], 3)
['can', 'null', 'provider']
>>> random.sample(["some", "provider", "can", "be", "null"], 3)
['null', 'some', 'provider']
>>> from random import randint
>>> left = randint(0, len(L))
>>> right = randint(left, len(L))
>>> L[left:right]
['null']

如果你不想要空列表的可能性

>>> left = randint(0, len(L) - 1)
>>> right = randint(left + 1, len(L))

伊格纳西奥的答案很棒。 如果要最低限度地修改代码,可以执行以下操作:

a_list = a_dict.get('APPLE_PROVIDERS', "")
if len(a_list) > 1:
    index1 = randrange(0,len(a_list)-1)
    index2 = randrange(index1+1,len(a_list))
    for item in a_list[index1:index2]:
        pass #do stuff

我在这里做两件事:1)我检查a_list是否有多个元素,2)我使用randrange生成索引,但是这样的方式使第二个保证大于第一个。

因此,假设您希望在获得空列表时返回空列表,这是一个示例解决方案:

from random import shuffle

def get_random_sublist(the_dict, key, number):
    l = the_dict.get(key, [])
    shuffle(l)
    return l[:number]

所以,我会使用random.shuffle 这使我可以避免要求一个比我们得到的实际列表更大的子列表的问题。

>>> DICT = {'a' : "1 2 3 4 5".split(), 'b': [], 'c': [1]}
>>> get_random_sublist(DICT, 'a', 3)
['4', '1', '2']
>>> get_random_sublist(DICT, 'b', 10)
[]

暂无
暂无

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

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