在Python中,我如何随机选择一个不在第二个列表中的列表的元素?

时间:2015-10-26 10:40:05

标签: python list random unique choice

假设我有一个list2来自大list1的随机选择的元素。是否有一种聪明的方法可以选择list1中尚未包含的list2中的元素?

例如:

list1 = range(20,100)
list2 = [37,49,22,35,72] # could be much longer

while True:
    n = random.choice(list1)
    if n not in list2:
        break

# now n is an element of list1 that's not in list2

我觉得必须有一种更有效的方法来做这个,而不是猜测和检查while循环。

5 个答案:

答案 0 :(得分:3)

您可以减去list2的{​​{1}}:

list1

并随机选择:

list3 = list(set(list1)-set(list2))

注意:您需要将set重新转换为random.choice(list3)

答案 1 :(得分:2)

您可以使用:

SELECT
    A.KeywordId,
    CASE WHEN B.CurrentPosition - A.CurrentPosition > 0 THEN 1 ELSE 0 END AS IMPROVED,
    CASE WHEN B.CurrentPosition - A.CurrentPosition < 0 THEN 1 ELSE 0 END AS DECREASED,
    CASE WHEN B.CurrentPosition - A.CurrentPosition = 0 THEN 1 ELSE 0 END AS NoChange
FROM
(SELECT * FROM seo.Tbl_KeywordPosition
 WHERE KeywordId IN ('1514','1515') AND PsnUpdateDate = '2015-10-05'
)AS A
    INNER JOIN (SELECT * FROM seo.Tbl_KeywordPosition
                WHERE KeywordId IN ('1514','1515') AND PsnUpdateDate = '2015-10-10'
                ) AS B
        ON A.ProjectId = B.ProjectId AND A.KeywordId = B.KeywordId

这使用列表推导来创建import random list1 = range(20,100) list2 = [37,49,22,35,72] not_in_list2 = [item for item in list1 if item not in list2] n = random.choice(not_in_list2) list1中不属于list2的所有元素的列表。然后它从该列表中随机选择。与使用集合时不同,此技术不会更改项目被选中的概率,因为它不会从list1中删除重复的元素。

答案 2 :(得分:1)

如果list1中没有重复元素,这是一种pythonic方式,使用set-

import random

list1 = range(20,100)
list2 = [37,49,22,35,72] # could be much longer

n = random.choice(tuple(set(list1)-set(list2)))

# now n is an element of list1 that's not in list2

需要tuple调用以避免NotIndexable例外。

答案 3 :(得分:0)

如果您想从列表中随机选择多个项目,或者从一个集合中选择一个项目,最好使用random.sample代替choice

import random
diff = set(list1)-set(list2)
num_to_select = 1 # set the number to select here.
list_of_random_items = random.sample(diff, num_to_select)

答案 4 :(得分:0)

如果您不希望创建新列表(或新列表和两个集合)的开销,如果list1非常大,则可能会变得非常昂贵,还有另一种选择。

import random

list1 = range(20,100)
list2 = [37,49,22,35,72]

for i in list2:
    while i in list1:
        list1.remove(i)

random.choice(list1)

只需遍历list2中的项目,然后将其从list1中删除即可。由于list.remove()仅删除第一次出现的项目,因此我添加了一个while循环以确保删除所有出现的内容。