как в словаре выводить рандомно ключи без повторений
появляются повторно ключи в цикле как лучше исправить это ?
import random
def main():
citizen_contru={'украина':'киев',
'россия':'москва',
'беларусь':'минск',
'молдова':'кишинев',
'ирландия':'дублин',
'португалия':'лессабон',
'греция':'афины',
'австрия':'вена',
'литва':'вильнюс',
'сербия':'белград',
'чехия':'прага',
'италия':'рим',
'испания':'мадрид',
'польша':'варшава',
'румыния':'бухарест',
'венгрия':'бухарест',
'германия':'берлин',
'норвегия':'осло', }
print('\t\t\t\tУгадайте столицу')
print()
print('Проверим ваши знания географии. Надо написать столицу страны ')
Kol_otvet=5
prav_otv=0
nepr_otv=0
while True:
a=random.choice(list(citizen_contru.keys()))
print(a,end=' ' )
b= input( )
if citizen_contru[a]==b:
prav_otv+=1
Kol_otvet-=1
else:
nepr_otv+=1
Kol_otvet-=1
if Kol_otvet==0:
print('Вы ответили правильно - ',prav_otv)
print('Вы ответили не правильно - ',nepr_otv)
break
main()
Ответы (2 шт):
Попробуй прогонять через random choices и string. Ссылка на примеры
Либо по id ключей через numpy unique
Давайте возьмем аналогию с колодой карт:
random.choice - это вы перетасовали колоду карт, вытащили карту из середины, посмотрели, вставили обратно. Никто не гарантирует, что вам снова не попадется эта же карта. Вы можете где-то помечать, какие карты уже выпадали, засовывать их обратно при повторном выпадении, но чем больше вы карт уже вытащили, тем чаще придется это делать.
Чтобы было без повторений, вам нужно перетасовать колоду, и последовательно снимать карты сверху колоды, пока колода не закончится. Значит берете список ключей, передаете в random.shuffle, потом по перетасованному списку ключей последовательно идете, пока список не закончится.
Дальше уже смотря что вам нужно - или заканчивать игру, или перетасовать еще раз, но в любом случае будут уже выходить те ключи, которые попадались раньше (вплоть до того, что первым ключом может оказаться последний ключ из предыдущего прохода).
countries = list(citizen_contru.keys()
random.shuffle(countries)
for a in countries:
b= input(a + "? ")
if citizen_contru[a]==b:
prav_otv+=1
Kol_otvet-=1
else:
nepr_otv+=1
Kol_otvet-=1
if Kol_otvet==0:
print('Вы ответили правильно - ',prav_otv)
print('Вы ответили не правильно - ',nepr_otv)
break
Либо через random.sample выбираете нужное количество случайных стран, и так же по ним последовательно идете (в аналогии с картами - вытащить n случайных карт из колоды, по одной их показать игроку). Тогда даже считать количество ответов не нужно будет, главное чтобы оно не оказалось больше общего количества стран.
for a in random.sample(citizen_contru.keys(), Kol_otvet):
b = input(a + "? ")
if citizen_contru[a] == b:
prav_otv += 1
else:
nepr_otv += 1
print('Вы ответили правильно -', prav_otv)
print('Вы ответили не правильно -', nepr_otv)