随机筛选字典的python列表,以获得基于相同键名的新字典列表



我想通过从基于相同键名的现有字典列表中随机选择字典来形成一个新的字典列表。

existing_list = [{'topic1': 'question1'}, {'topic2': 'question2'}, {'topic3': 'question3'}, {'topic2': 'question4'}, {'topic2': 'question5'}, {'topic1': 'question2'}, {'topic1': 'question3'}, {'topic3': 'question5'}, {'topic3': 'question6'}]

新列表应该随机选择两个具有相同键名的字典:

new_list = [{'topic1': 'question1'}, {'topic1': 'question3'}, {'topic2': 'question2'}, {'topic2': 'question5'}, {'topic3': 'question5'}, {'topic3': 'question3'}]

根据下面的建议,我改变了数据结构:

arrange = {}
for item in questions:
arrange.setdefault(item['parent'], []).append(item['question_link'])
question_lists_of_lists = [random.sample(arrange[topic], 2) for topic in arrange]
question_lists= sum(question_lists_of_lists,[])

现在我正在寻找更好的替代方案来实现新的列表使用:

new_list = []
for k, v in arrange.items():
for i in range(2):
random_value = random.choice(v)
new_list.append({k: random_value})
arrange[k].remove(random_value)

我很确定这就是你要找的代码:

import random
existing_list = [{'topic1': 'question1'}, {'topic2': 'question2'}, {'topic3': 'question3'}, {'topic2': 'question4'}, {'topic2': 'question5'}, {'topic1': 'question2'}, {'topic1': 'question3'}, {'topic3': 'question5'}, {'topic3': 'question6'}]
new_list = []
d = {}  # creating a new dictionary for better storage overview
# adding key-value pairs into the dictionary
for element in existing_list:
for k, v in element.items():
if k in d.keys():
d[k].append(v)
else:
d[k] = [v,]
# randomly choosing values from the dictionary
for k, v in d.items():
for i in range(2):
random_value = random.choice(v)
new_list.append({k: random_value})
d[k].remove(random_value)
print(new_list)

我认为你的主要问题是如何存储你的数据。拥有一个具有单个键值对的字典列表并不是那么容易处理的。

一个更好的方法可能是将不同的问题存储在每个主题的列表中,就像这样:

d = {'topic1': [question1, question2, question3], 'topic2': [question1, question2, question3]}

则可以像这样遍历字典:

for topic, questions in d.items():
q1 = d[topic][random(0, len(questions)].pop()
q2 = d[topic][random(0, len(questions)].pop()

然后你可以把这些问题存储在某个列表中,或者你想用什么就用什么。

(顺便说一句,list.pop()方法实际上从列表中删除了元素,但由于'questions'是循环中的局部变量,我认为应该很好)

最新更新