I want to form a new list of dictionaries by random choosing dictionary from existing list of dictionary based on same key name.
existing_list = [{'topic1': 'question1'}, {'topic2': 'question2'}, {'topic3': 'question3'}, {'topic2': 'question4'}, {'topic2': 'question5'}, {'topic1': 'question2'}, {'topic1': 'question3'}, {'topic3': 'question5'}, {'topic3': 'question6'}]
The new list should choose two random dictionary having same key name:
new_list = [{'topic1': 'question1'}, {'topic1': 'question3'}, {'topic2': 'question2'}, {'topic2': 'question5'}, {'topic3': 'question5'}, {'topic3': 'question3'}]
Taking suggestions below i change the data structures:
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,[])
Now i am looking for better alternative to achieve the new list using:
new_list = []
for k, v in arrange.items():
for i in range(1):
random_value = random.choice(v)
new_list.append({k: random_value})
arrange[k].remove(random_value)
CodePudding user response:
i think your main problem is how you store your data. having a list of dictionaries with a single key-value pair is not that easy to work with.
a better approach might be to store the different questions in a list for each topic so kind of like this:
d = {'topic1': [question1, question2, question3], 'topic2': [question1, question2, question3]}
then you can iterate through the dictionary like so:
for topic, questions in d.items():
q1 = d[topic][random(0, len(questions)].pop()
q2 = d[topic][random(0, len(questions)].pop()
then you can store those questions in some list or use them however you want.
(btw the list.pop() method actually removes the element from list but since 'questions' is a local variable in the loop it should be fine i think)
CodePudding user response:
I'm pretty sure this is the code that you are looking for:
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)