假设我有一个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循环。
答案 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循环以确保删除所有出现的内容。