gpt4 book ai didi

python - 创建一个字典列表,其中每个字典都包含另一个字典作为值

转载 作者:行者123 更新时间:2023-11-28 18:33:32 25 4
gpt4 key购买 nike

我正在用 Python 编写一个播放 this 的算法游戏。

游戏中棋盘的当前状态是以下形式的字典:

{
<tile_id>: {
'counters': <number of counters on tile or None>,
'player': <player id of the player who holds the tile or None>,
'neighbours': <list of ids of neighbouring tile>
},
...
}

我有另一本字典,它存储了我所有“满”的图 block (即计数器比它的邻居数量少一个并且 player 是我的图 block )这本字典,full_tiles,与上面的board字典形式相同。

我现在正在尝试创建一个列表,chains,其中列表中的每个元素都是我的完整图 block 的字典,这些图 block 至少与另一个完整图 block 相邻(即完整图 block 链).所以这将是我在板上的所有独立链的列表。

到目前为止,这是我的代码:

for tile_id, tile in full_tiles.items(): #iterates through all full tiles
current_tile = {tile_id : tile} #temporarily stores current tile
if not chains: #if chains list is empty
chains.append(current_tile) #begin list
else: #if list is not empty
for index, chain in enumerate(chains): #iterate though list of chains
if not (current_tile in chain): #if current tile is not in current chain
for tile_id2, tile2 in chain.items(): #iterate through tiles in current chain
for neighbour in tile2["neighbours"]: #iterate through each neighbour of current tile
#neighbour is in the form of tile_id
if neighbour in chain: #if current tile's neighbour is in chain
chain[tile_id] = tile #add tile to chain

我很难测试和调试我的代码并检查它是否正常工作,因为代码只能在模拟游戏的应用程序中运行。如您所见,此代码块中包含很多难以理解的嵌套循环。我现在似乎无法直接思考,所以老实说,我无法确定这个烂摊子是否会像我希望的那样发挥作用。

当我写这篇文章的时候,我刚刚意识到——在这段代码的第 7 行——我只是在检查当前的图 block 是否不在当前的链中,所以会有相交的链,当然,这将是一团糟。取而代之的是,我需要首先检查当前图 block 是否不在 任何 链中,而不仅仅是一个。

除此错误外,我的代码能否实现我正在尝试的目标?或者你能推荐一种更简单、更整洁的方法吗? (必须有!)

此外,如果我没有提供有关代码运行方式的足够信息,或者我是否需要进一步解释任何内容,例如 board 字典的内容,请告诉我。

提前感谢您的帮助。

编辑:不幸的是,我在时间限制下完成这个项目,因为这是我第一次使用 Python,我目前缺乏语言知识来优化我的解决方案下面给出的来源。这是我对这个问题的最终极其丑陋和困惑的解决方案,最终,它运行良好,并且考虑到代码所处理的小数据集,效率并不是非常低.

for x in range(0, len(my_hexplode_chains) - 1):
match_found = False
for y in range(x + 1, len(my_hexplode_chains)):
for tile_id_x, tile_x in my_hexplode_chains[x].items(): #compare each chain in list
for tile_id_y, tile_y in my_hexplode_chains[y].items(): #to every other chain
for neighbour in tile_x["neighbours"]: #if tiles in different lists
if neighbour == tile_id_y: #are neighbours
match_found = True
my_hexplode_chains[x].update(my_hexplode_chains[y]) #append one chain to the other
del my_hexplode_chains[y] #delete appended chain
if match_found: #continue loop at next chain
break #very ugly way to do this
if match_found:
break
if match_found:
break
if match_found:
break

最佳答案

这个优化怎么样?

def find_match (my_hexplode_chains):

x = 0
len_chain = len(my_hexplode_chains)
while x <= len_chain:
y = x + 1
for tile_id_x, tile_x in my_hexplode_chains[x].items():
for tile_id_y, tile_y in my_hexplode_chains[y].items():
if tile_id_y in tile_x["neighbours"]:
my_hexplode_chains[x].update(my_hexplode_chains[y])
del my_hexplode_chains[y]
return True
x += 1
return False

您可以在游戏中的每一步之后传递此函数并跟踪输出。

关于python - 创建一个字典列表,其中每个字典都包含另一个字典作为值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34657205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com