【问题标题】:How do you append modified data from a for loop? (Python)如何从 for 循环中附加修改后的数据? (Python)
【发布时间】:2015-01-03 20:43:36
【问题描述】:

感谢您查看我的问题,顺便说一下,我使用的是 Python 3,这是代码:)

scale=[1,2,3,4,5,6]
MNP = {'scale degree' : []
}


 for index, value in enumerate(scale):

    scale.insert(len(scale),scale[0])
    del scale[0]
    MNP['scale degree'].append(scale[1])
    print (MNP['scale degree'])

所以,我的目标是将我称为 scale 的列表的修改版本附加到我称为 MNP 的 dict 中。 所需的输出是一个列表('scale degree',它取一个列表的原始数字(例如比例),并将其移动到列表的末尾,同时,所有的数字都会移动一个到左,如果我在函数中给出打印比例的命令会发生这种情况:

for index, value in enumerate(scale):

    scale.insert(len(scale),scale[0])
    del scale[0]
    MNP['scale degree'].append(scale[1])
    print (MNP['scale degree'])

[1, 2, 3, 4, 5, 6]
[2, 3, 4, 5, 6, 1]
[3, 4, 5, 6, 1, 2]
[4, 5, 6, 1, 2, 3]
[5, 6, 1, 2, 3, 4]
[6, 1, 2, 3, 4, 5]

然而,当我尝试这样做时,我遇到了(是的,过去式)我的理解有问题。看,如果我执行命令:

    print(scale[1])

然后它实际上 确实 打印数字 2,3,4,5,6,1 。这就是我使用 enumerate 函数的原因,我认为这可以解决问题。我想,也许索引号以某种方式确定了 哪个列表 会被打印出来,但这当然是错误的,即使输出相同,而且值得提到我仍然是一个观星的新手。然而,我做了一些思考,意识到它只是打印出每个修改列表的第二个值,就像我给它一个命令只打印一个版本一样,但如果我要求它追加,它就是一个不听话的小虫子整个爆炸的事情。

该死的地狱。

所以,现在,我的问题是,我如何附加比例尺的修改版本,而不仅仅是一个值?

顺便说一句,将比例作为一个整体添加是行不通的(这也是我的第一个解决方案),因为当时的输出是: [[2, 3, 4, 5, 6, 1]] [[3, 4, 5, 6, 1, 2], [3, 4, 5, 6, 1, 2]] [[4, 5, 6, 1, 2, 3], [4, 5, 6, 1, 2, 3], [4, 5, 6, 1, 2, 3]]

它一直以这种方式运行,直到达到 [1,2,3,4,5,6] * 6

提前感谢您的帮助,如果可以的话,您能否推荐一些资源,以便我可以基本了解幕后发生的事情?可能还有很多我不明白的地方(我的意思是仅与这个问题有关,当然,总的来说,我接近理解所有要知道的东西(哈哈)。 p>

再次感谢

  • 詹姆斯

P.S 一般来说,我应该等多久才能在 SE 上寻求帮助? (对于这个特殊的问题,我一直在与 if 进行决斗,以获得稳定的第 1/2 天)

P.S.S 感谢 Borodin 指出在 for 循环中操作数据是不好的做法。这应该如何正确执行?

【问题讨论】:

  • 削减它的方式:你想在这里做什么?
  • 您希望MNP['scale degree'] 的内容在for 循环之后是什么?
  • 您不应该在迭代列表时修改它。这只会导致问题。
  • 大家好,我会把它放在描述中,谢谢你的反馈
  • 您不会在任何地方附加整个scale。语句 MNP['scale degree'].append(scale[1]) 仅附加 scale[1] - 第二个元素。如果你想追加scale的所有内容,那么你应该根据你想要的效果使用append(scale)extend(scale)

标签: python loops for-loop python-3.x append


【解决方案1】:

我认为this 会有所帮助。它有rotate(n),它将列表的元素移动n 个位置。

import collections
my_list = []
d = collections.deque([1,2,3,4,5])
for i in range(5):
    d.rotate(-1)
    my_list.append(d)
print my_list

输出:

[deque([1, 2, 3, 4, 5]), deque([1, 2, 3, 4, 5]), deque([1, 2, 3, 4, 5]), deque([1, 2, 3, 4, 5]), deque([1, 2, 3, 4, 5])]

【讨论】:

  • 谢谢,但是(是啊,我知道),它只适用于第一次轮换,之后发生了奇怪的事情:scale=collections.deque([1,2,3,4,5]) MNP = {'scale degree' : [] } for i in range(5): scale.rotate(-i) print (scale) >>>deque([1, 2, 3, 4, 5]) >>>deque([2, 3, 4, 5, 1]) >>>deque([4, 5, 1, 2, 3]) >>>deque([2, 3, 4, 5, 1]) >>>deque([1, 2, 3, 4, 5])
  • 您希望旋转多少次? “发生了一些奇怪的事情”,比如什么?
  • 它似乎按预期将第一个数字旋转到末尾,但随后它会旋转第一个和第二个数字,然后是前 3 个等。
  • 啊该死的,还有一个小问题,我无法将结果附加到另一个列表中,有没有办法做到这一点?
  • @user108262 立即查看我的答案。
【解决方案2】:

这是你想要的效果吗?

>>> l = [1,2,3,4]
>>> l.append(list.pop())
[2,3,4,1]

或者,如果您希望将其展开一点:

>>> l = [1,2,3,4]
>>> e = list.pop()
>>> l.append(e)
[2,3,4,1]

在这两种情况下,我们都会从列表中删除第一个元素并将其粘贴到列表的末尾 - 我认为这就是您所追求的。

或者如果您不想修改原始列表:

>>> l = [1,2,3,4]
>>> l[1:]+[l[0]]    
[2,3,4,1]

在这里,我们只是重新组合切片 - 原始列表没有改变。请注意,我必须将 l[0] 放入列表中,因为 + 是为列表实现的方式 - 我不能这样做 l[1:] + l[0]。

【讨论】:

  • 你是这个意思吗? scale=[1,2,3,4,5,6] MNP = {'scale degree' : [] } for i in(scale): scale.append(MNP['scale degree'].pop()) 打印(MNP['规模度'])
  • 不,我的意思是我说的。如果您想要循环左移,这是最简单的方法之一。你不需要循环。
  • 啊,这样吗? scale.append(scale.pop(0)) 另外,很抱歉不能弄乱,它不会像发布 Q 时那样格式化
  • 是的,就像那样。如果您不想修改scale,请查看我最新的非破坏性方法编辑。
  • 嗨,谢谢,它有效!有没有办法多次这样做,我应该使用循环吗?
猜你喜欢
  • 2018-05-11
  • 2023-03-14
  • 2014-08-28
  • 2020-12-29
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
相关资源
最近更新 更多