【问题标题】:I would expect the output to be like [[1,2,3,4,5,6,7,8,9,10],[2,4,6,8,10,12...18,20],[3,6,9...27,30].....[9,18,27..90]]我希望输出类似于 [[1,2,3,4,5,6,7,8,9,10],[2,4,6,8,10,12...18,20] ,[3,6,9...27,30].....[9,18,27..90]]
【发布时间】:2018-08-10 08:14:52
【问题描述】:

我正在使用 python。我需要得到我在底部提到的输出。这是我尝试的方式。

 L = [i for i in range(1,11)]
    print(L)
    p = []
    p.extend(L for _ in range(10))
    #print(p)
    for _ in range(10):
        for i in range(10):
            p[_][i] = (_+1)*p[_][i]
    print(p)
and this is the output I got.

输出:[[3628800, 7257600, 10886400, 14515200, 18144000, 21772800 25401600, 29030400, 32659200, 36288000], [3628800, 7257600, 10886400, 14515200, 18144000, 21772800, 25401600, 29030400, 32659200, 36288000], [3628800、7257600、10886400、14515200、18144000、21772800、25401600、 29030400, 32659200, 36288000], [3628800, 7257600, 10886400, 14515200, 18144000, 21772800, 25401600, 29030400, 32659200, 36288000], [3628800, 7257600, 10886400, 14515200, 18144000, 21772800, 25401600, 29030400, 32659200, 36288000], [3628800, 7257600, 10886400, 14515200, 18144000, 21772800, 25401600, 29030400, 32659200, 36288000], [3628800, 7257600, 10886400, 14515200, 18144000, 21772800, 25401600, 29030400, 32659200, 36288000], [3628800, 7257600, 10886400, 14515200, 18144000, 21772800, 25401600, 29030400, 32659200, 36288000], [3628800, 7257600, 10886400, 14515200, 18144000, 21772800, 25401600, 29030400, 32659200, 36288000], [3628800、7257600、10886400、14515200、18144000、21772800、25401600、 29030400, 32659200, 36288000]]

我希望输出像

[[1,2,3,4,5,6,7,8,9,10],[2,4,6,8,10,12...18,20],[3,6,9...27,30].....[9,18,27..90]]

【问题讨论】:

  • 问题是:如何获得预期的输出或者为什么会得到那个奇怪的输出?

标签: python list loops nested-loops nested-lists


【解决方案1】:

有几个问题: 不要使用 _ 作为变量名,它是用于您不会重用的变量。

由于这条线,您遇到了这个问题:

p.extend(L for _ in range(10))

p 是对 L 的引用列表。所以当你这样做时:

p[_][i] = (_+1)*p[_][i]

您修改了 L,因此修改了 p 中的所有列表。

您的代码已修复:

p = []
p.extend(list(range(1,11)) for _ in range(10))

for i in range(10):
    for j in range(10):
        p[i][j] = (i+1)*p[i][j]
print(p)

但是,有一种更简单的方法:

p  = [ list(range(i, i*11, i )) for i in range(1,10)]

【讨论】:

  • 更多关于这方面的信息可以在这里找到:nedbatchelder.com/text/names1.html
  • 嗨,你说 L 在执行 p[][i] = (_+1)*p[][i] 行之后被修改,但是当我打印时L,最终,它仍然保持着它的初始值。
  • 所以我的问题是:如果 L 正在改变,那么为什么我在最后再次打印时看不到变化?
  • 如果我复制/粘贴您的代码并打印(L)最后 L 值:[3628800, 7257600, 10886400, 14515200, 18144000, 21772800, 25401600, 29030400, 32659200, 2880] 3已修改
  • 是的,是的,你是对的,它确实发生了变化。但是你知道为什么列表的起始值最终是 3628800 吗??
【解决方案2】:
L = [i for i in range(1,11)]
print(L)
d = []
for i in range(1, 11):
    d.append([i * j for j in L])

print(d)

输出:

[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [2, 4, 6, 8, 10, 12, 14, 16, 18, 20], [3, 6, 9, 12, 15, 18, 21, 24, 27, 30], [4, 8, 12, 16, 20, 24, 28, 32, 36, 40], [5, 10, 15, 20, 25, 30, 35, 40, 45, 50], [6, 12, 18, 24, 30, 36, 42, 48, 54, 60], [7, 14, 21, 28, 35, 42, 49, 56, 63, 70], [8, 16, 24, 32, 40, 48, 56, 64, 72, 80], [9, 18, 27, 36, 45, 54, 63, 72, 81, 90], [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]]

【讨论】:

  • 太好了,但我只是想要一些帮助来弄清楚为什么我的方法会导致与我预期不同的输出。
【解决方案3】:

您可以使用列表推导:

new_data = [list(filter(lambda x:not x%i, range(i, (10*i)+1))) for i in range(1,10)]

输出:

[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [2, 4, 6, 8, 10, 12, 14, 16, 18, 20], [3, 6, 9, 12, 15, 18, 21, 24, 27, 30], [4, 8, 12, 16, 20, 24, 28, 32, 36, 40], [5, 10, 15, 20, 25, 30, 35, 40, 45, 50], [6, 12, 18, 24, 30, 36, 42, 48, 54, 60], [7, 14, 21, 28, 35, 42, 49, 56, 63, 70], [8, 16, 24, 32, 40, 48, 56, 64, 72, 80], [9, 18, 27, 36, 45, 54, 63, 72, 81, 90]]

【讨论】:

    猜你喜欢
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2022-01-14
    • 2023-01-05
    • 2019-05-25
    相关资源
    最近更新 更多