是否有一种方法来存储一个while循环的结果(使用随机模块)在一个新的变量内-被重用?



我想从这个函数中获取5个随机结果(将是字典中的五个键值对),并重用它们。有什么办法吗?

def display_cards():
i = 1
while i < 6:
print("")
time.sleep(3)
random_number = random.randint(0, len(flashcards))
CARDNAME = "flash_" + str(random_number) 
print(flashcards[CARDNAME])
i += 1
display_cards()

一个示例结果可能是这样的(只是给一个想法):

{'ingenjör (n)': 'Engineer'}
{'lärare (n)': 'Teacher'}
{'programmerare (n)': 'Programmer'}
{'försäljare (n)': 'Salesman'}
{'snickare (n)': 'Carpenter'}

每次运行代码时,这五个结果都会不同(总共100个)。挑战在于获取并保持随机结果,并以某种方式将其存储在变量中,以便重用键值对的组合。这可能吗?

这里我将展示前几张抽认卡(字典中的嵌套字典),给出它们是如何格式化的概念:

flashcards = {"flash_0" : {"vecka (n)": "week"},
"flash_1" : {"år (n)": "year"},
"flash_2" : {"idag (adv)": "today"},
"flash_3" : {"imorgon (adv)": "tomorrow"},
"flash_4" : {"igår (adv)": "yesterday"},
"flash_5" : {"kalender (n)": "calendar"},

如果将选择随机抽听卡的逻辑从呈现给用户的循环中分离出来,则可以大大简化代码。前者可以很容易地使用random.sample!

import random
flashcards = {"flash_0" : {"vecka (n)": "week"},
"flash_1" : {"år (n)": "year"},
"flash_2" : {"idag (adv)": "today"},
"flash_3" : {"imorgon (adv)": "tomorrow"},
"flash_4" : {"igår (adv)": "yesterday"},
"flash_5" : {"kalender (n)": "calendar"},
}
sample = random.sample(flashcards.values(), 5) # pick 5 random values without repeating
for value in sample:  # loop over the values in the sample
print()
time.sleep(3)
print(value)

如果你愿意,你可以在其他代码中重用相同的sample

最后需要说明的是,flashcards字典可能作为列表更好,因为键不是很有意义(只是一个固定字符串后面跟着一个整数,而列表只是直接由整数索引)。类似地,值作为2元组可能比作为单元素字典更好。字典很棒,但并不是所有地方都是理想的!

IUUC.

一种方法是将结果存储在列表字典中。

假设输入:

flashcards = {
"flash_0" : {"vecka (n)": "week"}, 
"flash_1" : {"år (n)": "year"}, 
"flash_2" : {"idag (adv)": "today"}, 
"flash_3" : {"imorgon (adv)": "tomorrow"}, 
"flash_4" : {"igår (adv)": "yesterday"}, 
"flash_5" : {"kalender (n)": "calendar"}
}

函数,我已经修改了你的函数,因为有一些不必要的行和未使用的变量i:

def display_cards():
arr = []
for _ in range(1, 6):
random_number = random.randint(0, len(flashcards) - 1)
CARDNAME = "flash_" + str(random_number)
arr.append(flashcards[CARDNAME])
return arr

现在,我们可以运行函数并将结果存储在一个变量中。例如abc:

abc = display_cards()

输出:

[{'igår (adv)': 'yesterday'},
{'vecka (n)': 'week'},
{'år (n)': 'year'},
{'idag (adv)': 'today'},
{'igår (adv)': 'yesterday'}]

一种更灵活的方法,如果将来要抽的牌的数量可以改变,则在函数参数中传递要抽的牌的数量。如下所示:

def display_cards(number_of_cards_to_generate):
arr = []
for _ in range(number_of_cards_to_generate):
random_number = random.randint(0, len(flashcards) - 1)
CARDNAME = "flash_" + str(random_number)
arr.append(flashcards[CARDNAME])
return arr

然后,你可以这样调用函数:

cards = display_cards(5)

挑战在于获取并保持随机结果,并以某种方式将其存储在变量中,以便重用键值对的组合。这可能吗?

是的,只保留一个变量在你的函数范围之外。

#keep a list of draws
card_sets = []
def display_cards():
i = 1
while i < 6:
print("")
time.sleep(3)
random_number = random.randint(0, len(flashcards))
CARDNAME = "flash_" + str(random_number) 
print(flashcards[CARDNAME])
#add it to the global list of cards 
card_sets.append(flashcards[CARDNAME])
i += 1
display_cards()
#now can access all the card draws in card_sets

有个办法…我决定把选牌和展示选牌分开。因为也许以后把它们作为独立的函数会更有意义。但是如果你喜欢的话,你可以把这些循环组合起来。重要的是要保存你所选择的列表,以便你以后可以参考它。

import random
import time
flashcards = {
"flash_0" : {"vecka (n)": "week"},
"flash_1" : {"år (n)": "year"},
"flash_2" : {"idag (adv)": "today"},
"flash_3" : {"imorgon (adv)": "tomorrow"},
"flash_4" : {"igår (adv)": "yesterday"},
"flash_5" : {"kalender (n)": "calendar"},
}
def display_cards():
# I separated the selection of the cards to be displayed from the actual display of the
# card for greater flexibility.  First, select a list of 5 cards at random...
displayed_list = []
while len(displayed_list) < 5:
displayed_list.append(flashcards["flash_%s" % random.randint(0, len(flashcards)-1)])
# Now, display the list of cards, slowly.
for card in displayed_list:
print("")
time.sleep(3)
print(card)
# return the list so we can refer to it later
return displayed_list
# call our function and get the returned list of cards...
cards_that_were_displayed = display_cards()

最新更新