[英]Why is the output of nested loops in a different order than expected?
這是一個程序,用於打印字符串的每個字母以及矩陣中字母的坐標。
在這個例子中,output 應該是
['s12', 'k12', 'i33', 'l13', 'l13', 'r11', 'a11', 'c13', 'k12']
但我實際上得到
['r11', 'a11', 's12', 'k12', 'k12', 'l13', 'l13', 'c13', 'i33']
s1 = "skillrack"
mat1 = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
mat2 = [['j', 'k', 'l'], ['m', '.', 'n'], ['o', 'p', 'q']]
mat3 = [['r', 's', 't'], ['u', 'v', 'w'], ['x', 'y', 'z']]
ans = []
for i in range(0, len(mat1)):
for j in range(0, len(mat1[i])):
for x in range(0, len(s1)):
if s1[x] == mat1[i][j]:
ans.append(str(s1[x]) + str(i+1) + str(j+1))
elif s1[x] == mat2[i][j]:
ans.append(str(s1[x]) + str(i+1) + str(j+1))
elif s1[x] == mat3[i][j]:
print(mat3[i][j])
ans.append(str(s1[x]) + str(i+1) + str(j+1))
print(ans)
ans
的 output 被洗牌,我需要按s1
的順序。 我怎樣才能正確地做到這一點?
最外面的循環定義了項目在列表中出現的順序。
如果您希望列表與輸入字符串s1
的順序相同,則for x in range(0, len(s1)):
的循環必須先出現:
for x in range(0, len(s1)):
for i in range(0, len(mat1)):
for j in range(0, len(mat1[i])):
為了保持順序,您可以遍歷s1
中的每個字符並獲得正確的值。
def get_code(needle, matrixes):
for matrix in matrixes:
for index1, characters in enumerate(matrix, start=1):
for index2, character in enumerate(characters, start=1):
if needle == character:
return f'{needle}{index1}{index2}'
result = [get_code(character, [mat1, mat2, mat3]) for character in s1]
print(result)
這會給你['s12', 'k12', 'i33', 'l13', 'l13', 'r11', 'a11', 'c13', 'k12']
。
我使用列表解析來循環字符串的字符,並將查找正確值的任務委托給 function get_code
。 由於使用range
進行索引訪問被認為是unpythonic ,因此我使用enumerate
來獲取索引和匹配值。
Python 中的str
對象可以被索引並用作 arrays。
range()
start
已經默認為0
,因此無需將其作為第一個參數傳遞給range()
。
f-strings
是比將數字轉換為字符串然后將它們連接在一起更好的選擇。
不是要求,但如果您遵循PEP8,Python 代碼建議的樣式指南,您的代碼會更好看。
考慮到上述概念,這里有一個更Pythonic的代碼版本,@mkrieger1 在他的回答中建議了修復:
s1 = "skillrack"
mat1 = ['abc', 'def', 'ghi']
mat2 = ['jkl', 'm.n', 'opq']
mat3 = ['rst', 'uvw', 'xyz']
ans = []
for x in range(len(s1)):
for i in range(len(mat1)):
for j in range(len(mat1[i])):
if s1[x] == mat1[i][j]:
ans.append(f'{s1[x]}{i + 1}{j + 1}')
elif s1[x] == mat2[i][j]:
ans.append(f'{s1[x]}{i + 1}{j + 1}')
elif s1[x] == mat3[i][j]:
ans.append(f'{s1[x]}{i + 1}{j + 1}')
print(ans)
上面的代碼將為您提供以下 output:
['s12', 'k12', 'i33', 'l13', 'l13', 'r11', 'a11', 'c13', 'k12']
s1="skillrack"
mat1=[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
mat2=[['j', 'k', 'l'], ['m', '.', 'n'], ['o', 'p', 'q']]
mat3=[['r', 's', 't'], ['u', 'v', 'w'], ['x', 'y', 'z']]
ans=[]
for i in range(len(s1)):
for j in range(len(mat1)):
for k in range(len(mat1)):
if s1[i]==mat1[j][k]:
ans.append(s1[i]+str(j+1)+str(k+1))
elif s1[i]==mat2[j][k]:
ans.append(s1[i]+str(j+1)+str(k+1))
elif s1[i]==mat3[j][k]:
ans.append(s1[i]+str(j+1)+str(k+1))
print(ans)
您必須使用列表理解來為您的答案獲取排序列表,例如:
print(sorted(l, key=lambda x: int("".join([i for i in x if i.isdigit()]))))
或者
print(sorted(l, key=lambda x: int("".join([i for i in x if i.isalpha()]))))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.