我的數據結構如下:嘗試從字典中的列表中刪除列表中的特定項目。 (Python2)
def cross(A, B):
return [a+b for a in A for b in B]
digits = '123456789'
rows = 'ABCDEFGHI'
cols = digits
squares = cross(rows, cols)
unitlist = ([cross(rows, c) for c in cols] +
[cross(r, cols) for r in rows] +
[cross(rs, cs) for rs in ('ABC', 'DEF', 'GHI') for cs in ('123', '456', '789')])
units = dict((s, [u for u in unitlist if s in u]) for s in squares)
peers = dict((s, set(sum(units[s],[]))-set([s])) for s in squares)
這會導致單位輸出
{'A1': [['A1','A2','A3','A4','A5','A6','A7','A8','A9'],
['A1','B1','C1','D1','E1','F1','G1','H1','I1'],
['A1','A2','A3','B1','B2','B3','C1','C2','C3']],
'A2': [['A1','A2','A3','A4','A5','A6','A7','A8','A9'],
['A2','B2','C2','D2','E2','F2','G2','H2','I2'],
['A1','A2','A3','B1','B2','B3','C1','C2','C3']],
'A3': [[etc.]]}
我希望能夠創建爲單位的副本,但沒有鑰匙是一個字符串在自己的列表中。所以我想從前三個列表中刪除'A1'。 「A2」從未來3名列表中刪除等
我可以導入副本和做units2 = copy.deepcopy(units)
然後units2['A1'][0].remove('A1')
做一次一個列表。所以這導致我嘗試做一個循環來一次完成所有的事情。
for s in squares: #assign s to 'A1' then 'A2', etc.
for x in range(3): #
units2[s][x].remove(s)
我會認爲這會做它準確無誤地運行
units2['A1'][0].remove('A1')
units2['A1'][1].remove('A1')
units2['A1'][2].remove('A1')
units2['A2'][0].remove('A2')
# etc.
不幸的是,運行該循環之後,我結束了:
units2 = {'B8': [[], [], []],
'H1': [[], [], []],
'C7': [[], [], []],
'B3': [[], [], []],
# etc.
}
所以不知何故,這個循環是刪除列表中的所有數據而不是當前[x]列表中的當前[s]。
我曾嘗試構建以不同的方式列表,還送81個版本的
for x in range(3):
units2['A1'][x].remove('A1')
for x in range(3):
units2['A2'][x].remove('A2')
for x in range(3):
units2['A3'][x].remove('A3')
但我仍然最終以空列表所有我的字典值。 *我想要做的是構建一個數獨解算器,然後用它來爲PyGame中的遊戲生成數獨遊戲。我打算使用units2
中的列表來檢查並查看在任何給定列表中是否只有1個單元仍符合特定數字的條件。如果是這種情況,我知道該單元格必須具有該數字作爲它的值,因爲它是列,行或9x9塊中唯一可以根據規則合法保留它的值。
什麼是跨職能? – Radek