簡體   English   中英

為什么嵌套循環的 output 的順序與預期不同?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM