【问题标题】:Assigning N number of elements from a flat list, itterativly to each member of a matrix从平面列表中分配 N 个元素,迭代地分配给矩阵的每个成员
【发布时间】:2013-12-24 20:22:56
【问题描述】:

我有一个平面列表 message,我有一个矩阵,其中每一行只包含一个元素

final = [['K'], ['E'], ['Y']]
message = ['F', 'F', 'F', 'C', 'F', 'D', 'C', 'C', 'F', 'D', 'C', 'C', 
           'B', 'F', 'F', 'F', 'B', 'B', 'C', 'C', 'F', 'F', 'A', 'A']

我想将消息中的每 2 个字母对分配给 final 的单个字母,但我想一次迭代两个字母,然后循环遍历 final。

所以我会得到类似的东西

final = [[K, F, F, C, C, B, F, C, C],
         [E, F, C, F, D, F, F, F, F],
         [Y, F, D, C, C, B, B, A, A]]

注意循环效果,我需要从message 中取出两个元素,并在6 个元素之后将它们分配给final 的元素之一,然后我将返回K 并开始将它们分配给@987654326 上的“循环” @

环顾四周并与聊天中的一些人交谈后,我得到了

code = [[i] + list(y) for i, y in zip_longest(key, zip(*[iter(mes)] * 2),fillvalue='-')]

但是我得到了错误的结果,而不是用- 填充缺失值我想循环回原始的最终矩阵。


我明白了:

[['M', 'F', 'F'], ['A', 'F', 'C'], ['R', 'F', 'D'], ['K', 'C', 'C'], ['-', 'F', 'D'], ['-', 'C', 'C'], ['-', 'B', 'F'], ['-', 'F', 'F'], ['-', 'B', 'B'], ['-', 'C', 'C'], ['-', 'F', 'F']]


使用周期:

[[i] + list(y) for i, y in zip(cycle(key), zip(*[iter(mes)] * 2))]

结果:

[['M', 'F', 'F'], ['A', 'C', 'C'], ['R', 'B', 'C'], ['K', 'D', 'E'], ['M', 'B', 'C'], ['A', 'D', 'E'], ['R', 'C', 'A'], ['K', 'E', 'D'], ['M', 'D', 'E'], ['A', 'F', 'F'], ['R', 'D', 'C'], ['K', 'F', 'F'], ['M', 'E', 'B'], ['A', 'D', 'E'], ['R', 'F', 'F']]

这很接近,但我只想附加字母而不是重复 MARK 的字母

【问题讨论】:

  • 你需要什么循环?我用while message: for lst in final: for _ in range(2): lst.append(message.pop(0)) 得到了正确的输出
  • 我需要循环遍历键,所以我分配 2 个元素,然后转到 E,分配 2 个元素,然后 Y 分配 2 个元素,然后将 bakc 分配给 K 并重复
  • 这些答案无法正常工作的原因是我最终制作了一个一维列表,因为它需要是每个字母的维度。错误的解决方法,尝试使用其中一种方法来为人们提供帮助!

标签: python list matrix list-comprehension


【解决方案1】:

我认为您试图使这一点过于复杂化。试一试:

final = [['K'], ['E'], ['Y']]
message = ['F', 'F', 'F', ...]
while message:
    for lst in final:
        for _ in range(2):
            lst.append(message.pop(0))

这给了我你正在寻找的结果。

如果您真的必须使用列表推导式,您可以使用以下方法:

final = [final[index] + reduce(lambda x, y: x + y, 
                               list(message[i:i+2] for i in 
                                    range(index,
                                          len(message), 
                                          2 * len(final))))
         for index in range(len(final))]

但这确实是更多的列表不理解。

【讨论】:

  • 什么是 lst?我得到 .append 不是 lst 的属性,但我猜那只是因为我不知道 lst 是什么
  • lst 是我将final 中的每个list 分配给的循环变量。
  • 对不起,我意识到,当我的大脑苏醒时,我得到了这个被实施的错误接受
  • 哈哈我接受你的回答,但我只是在执行它时遇到了麻烦
  • 此方法有效,只是当列表为空时它仍会尝试弹出,这会导致索引错误
【解决方案2】:

怎么样:

from itertools import izip, izip_longest, cycle

final = [['K'],
         ['E'],
         ['Y']]
message = ['F', 'F', 'F', 'C', 'F', 'D', 'C', 'C', 'F', 'D', 'C', 'C', 'B', 'F', 'F', 'F', 'B', 'B', 'C', 'C', 'F', 'F', 'A', 'A']

by_2 = izip_longest(*[iter(message)]*2, fillvalue='-')
for fin_list, vals in izip(cycle(final), by_2):
    fin_list.extend(vals)

# [['K', 'F', 'F', 'C', 'C', 'B', 'F', 'C', 'C'], ['E', 'F', 'C', 'F', 'D', 'F', 'F', 'F', 'F'], ['Y', 'F', 'D', 'C', 'C', 'B', 'B', 'A', 'A']]

【讨论】:

  • 再次 str 对象没有属性。扩展我不明白为什么 fin_list 应该是一个列表时总是一个字符串
  • @alko 它修改了final inplace
  • @JonClements 是的,刚刚发现
  • 这个错误与我的最终结果是一维字符串而不是矩阵有关!
【解决方案3】:

一个好的旧while循环怎么样?

i = 0
while i < len(message):
    for part in range(3):
        final[part].append(message[i])
        final[part].append(message[i + 1])
        i += 2

这段代码应该可以完全复制并粘贴到您的代码中。有时while 循环比for 循环简单得多,我喜欢使用它们。这段代码简单地遍历了final 的每个部分,并为每个部分添加两个来自消息,while 循环负责执行此操作,直到所有消息都被适当地复制到 final 中。

【讨论】:

    猜你喜欢
    • 2021-02-10
    • 2013-04-01
    • 1970-01-01
    • 2017-11-27
    • 2019-08-16
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2018-12-02
    相关资源
    最近更新 更多