【问题标题】:For loop python?对于循环python?
【发布时间】:2016-06-06 01:12:55
【问题描述】:

我需要创建 for 循环的帮助或如何更好地执行此操作的建议。 根据行数和列数,我有一个 0 的空列表。然后是另一个包含数据的列表。

我手动记录了如何更改值以使其可视化。

r = 2
c = 2
all_list = [[0 for x in range(c*3)] for y in range(3*r)]
a = [[[' ', 55, ' '], [57, 0, 63], [' ', 43, ' ']], [[' ', 71, ' '], [95, 1, 64], [' ', 37, ' ']], [[' ', 80, ' '], [12, 2, 49], [' ', 69, ' ']], [[' ', 63, ' '], [54, 3, 17], [' ', 84, ' ']]]

#Need to convert the list above to this.
#[[' ', 55, ' ', ' ', 71, ' '], [57, 0, 63, 95, 1, 64], [' ', 43, ' ', ' ', 37, ' '], [' ', 80, ' ', ' ', 63, ' '], [12, 2, 49, 54, 3, 17], [' ', 69, ' ', ' ', 84, ' ']]

all_list[0][0] = a[0][0][0]
all_list[0][1] = a[0][0][1]
all_list[0][2] = a[0][0][2]
all_list[0][3] = a[1][0][0]
all_list[0][4] = a[1][0][1]
all_list[0][5] = a[1][0][2]

all_list[1][0] = a[0][1][0]
all_list[1][1] = a[0][1][1]
all_list[1][2] = a[0][1][2]
all_list[1][3] = a[1][1][0]
all_list[1][4] = a[1][1][1]
all_list[1][5] = a[1][1][2]

all_list[2][0] = a[0][2][0]
all_list[2][1] = a[0][2][1]
all_list[2][2] = a[0][2][2]
all_list[2][3] = a[1][2][0]
all_list[2][4] = a[1][2][1]
all_list[2][5] = a[1][2][2]

all_list[3][0] = a[2][0][0]
all_list[3][1] = a[2][0][1]
all_list[3][2] = a[2][0][2]
all_list[3][3] = a[3][0][0]
all_list[3][4] = a[3][0][1]
all_list[3][5] = a[3][0][2]

all_list[4][0] = a[2][1][0]
all_list[4][1] = a[2][1][1]
all_list[4][2] = a[2][1][2]
all_list[4][3] = a[3][1][0]
all_list[4][4] = a[3][1][1]
all_list[4][5] = a[3][1][2]

all_list[5][0] = a[2][2][0]
all_list[5][1] = a[2][2][1]
all_list[5][2] = a[2][2][2]
all_list[5][3] = a[3][2][0]
all_list[5][4] = a[3][2][1]
all_list[5][5] = a[3][2][2]
print(all_list)

这是我目前所拥有的:

  for i in range(len(all_list)):
        for j in range(r*c):
            for k in range(r):
                for t in range(3):
                    all_list[i][j] = a[][k][t] #This is not correct

【问题讨论】:

  • 那么是一个 3 维列表 4x3x3 并且您想将其重塑为 4x6 矩阵吗?
  • @Seekheart 打印这样的列表:s='\n'.join([' '.join([str(item) for item in row]) for row in all_list]) print(s)

标签: python loops for-loop nested-loops


【解决方案1】:

这行得通:

firstHalf = [thing[0]+thing[1] for thing in zip(*a)]
secondHalf = [thing[2]+thing[3] for thing in zip(*a)]
reshaped = firstHalf + secondHalf

输出

[[' ', 55, ' ', ' ', 71, ' '],
 [57, 0, 63, 95, 1, 64],
 [' ', 43, ' ', ' ', 37, ' '],
 [' ', 80, ' ', ' ', 63, ' '],
 [12, 2, 49, 54, 3, 17],
 [' ', 69, ' ', ' ', 84, ' ']]

【讨论】:

  • 你知道为什么在 reshape 调用 print 时它只打印 firstHalf 吗?
  • 它为我打印整个列表(列表)。你用的是 python 2.7.x 还是 3.x
  • 我使用的是 3.x。如果我在 firstHalf = 之后再次添加 zipped = zip(*a),我可以打印整个列表。
  • 是的!在 python 3.x 中, zip 返回一个迭代器而不是一个列表(这意味着你只能迭代它一次!)。已修复兼容性
  • 如果我想把它变成一个循环而不考虑 range(4) 或者一个东西中只有两个东西用于 zip(*a)。我在正确的道路上吗? for thing in zip(*a): for i in range(2): firstHalf = [thing[i]+thing[i+1] for thing in zip(*a)]
【解决方案2】:

来自我很久以前写的答案:

def nested_loop(n, l):
    for c in range(l ** n):
        yield tuple(c // l**x % l for x in reversed(range(n)))

根据你的情况,像这样使用它:

for (i, j) , (l, k, m) in zip(nested_loop(2, 6), nested_loop(3, 3)):
    all_list[i][j] = a[k][l][m]

编辑:我刚刚注意到k 不太正确,正在尝试修复它。

【讨论】:

    【解决方案3】:

    我可以看到 i 和 j 从 k & t 独立递增。所以我宁愿写另一个函数来处理 i& j 的递增。

    喜欢

    incrementIandJ(i,j)
    {
    if (J==5){i++;j=0)
    }
    

    并编写 3 个 for 循环来更改 a[][][] 的索引;喜欢

    for l in range (len(a))
       for k in range ...
          for t in range ....{
                all_list[i][j]  = a[l][k][t];
                incrementIandJ(i,j);
                }
    

    希望这能回答您的问题。在性能方面可能不是最好的优化,但我推断这不是问题。

    【讨论】:

    • 看起来您用 C 编写的代码比用 Python 编写的要多。在 Python 中,您不需要大括号或分号。此外,i++ 是无效语法。 if 语句后需要一个冒号,并且需要缩进。 if 语句中的命令应该换行并缩进。
    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 2016-01-24
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    相关资源
    最近更新 更多