【问题标题】:What's a Pythonic way of taking a list of lists and "distributing" elements from another list to the sublists?获取列表列表并将元素从另一个列表“分配”到子列表的 Pythonic 方式是什么?
【发布时间】:2019-03-21 03:57:09
【问题描述】:

我已经尝试学习 Python 不到两周了。所以,对不起,如果我完全被误导了。

我已经搜索了大约五天,因为我一直在学习这个问题的答案的语言,而且措辞对我来说很难表达,所以如果我错过了,请随时将其标记为重复并指出我正确的方向。

假设我有list1 = [[x, y], [a, b]]list2 = [0, 1]

我要list3 = [[x, y, 0], [x, y, 1], [a, b, 0], [a, b, 1]]

在我对 StackOverflow 的研究和自己的实验中,我找到了获得各种类似结果的方法,例如:

[[x, y, 0], [a, b, 1]]

[[x, y, 0, 1], [a, b, 0, 1]]

[[x, y, 0, 1], [a, b]]

[[[x, y], 0], [[x, y], 1], [[a, b], 0], [[a, b], 1]]

我一直在考虑的事情是做以下事情:

  1. 在 list1 中创建尽可能多的子列表迭代 list2 中的元素 [[x, y], [a, b]] -> [[x, y], [x, y], [a, b], [a, b]]
  2. 扁平化 list1 使其不再是子列表,而是重复 元素[[x, y], [x, y], [a, b], [a, b]] -> [x, y, x, y, a, b, a, b]
  3. 遍历list1的元素并插入 list2 沿扁平化列表[x, y, x, y, a, b, a, b] -> [x, y, 0, x, y, 1, a, b, 0, a, b, 1]
  4. 将元素分组到 合适的尺寸: [x, y, 0, x, y, 1, a, b, 0, a, b, 1] -> [[x, y, 0], [x, y, 1], [a, b, 0], [a, b, 1]]

如果这是我必须做的,那么这就是我必须做的,我正在寻找一种方法来做到这一点,但我觉得必须有某种更 Pythonic 的方式来做这个操作(再说一遍,我知道什么?)如果是这样,我正在努力找出它可能是什么。

【问题讨论】:

    标签: python list append


    【解决方案1】:

    本质上,这只是两个列表的交叉产品。

    >>> import itertools
    >>> list(itertools.product(list1, list2))
    [(['x', 'y'], 0), (['x', 'y'], 1), (['a', 'b'], 0), (['a', 'b'], 1)]
    

    剩下要做的就是展平每个元组。

    >>> [x + [y] for x,y in itertools.product(list1, list2)]
    [['x', 'y', 0], ['x', 'y', 1], ['a', 'b', 0], ['a', 'b', 1]]
    

    【讨论】:

    • 谢谢!这正是我一直在寻找的。在 itertools 中,我只查看并尝试了循环,并且在那里没有运气,而且我之前还没有看到列表中扁平元组的特殊构造。
    【解决方案2】:

    我可能是错的,但我认为没有一个很好的 itertools 解决方案

    def permutations(a,b):
        for sublist in a:
            for value in b:
                yield sublist + [value]
    
    list1 = [[x, y], [a, b]] 
    list2 = [0, 1]
    print(list(permutations(list1, list2)))
    

    【讨论】:

      【解决方案3】:

      仅使用列表推导:

      list3 = [list[:] + [elem] for list in list1 for elem in list2]
      

      【讨论】:

      • 您在此处列出的代码未提供我正在寻找的行为。这使用我的示例生成: [ [ [x, y], [a, b], 0], [ [x, y], [a, b], 1], [ [x, y], [a, b], 0], [[x, y], [a, b], 1]]
      • 那个代码(复制和粘贴)给了我你想要的东西。可能是打字错误?
      • 我也复制粘贴了。如果我将它编辑为 [list + [elem] for list in list1 for elem in list2],那么它可以工作,但是 list[:] 给了我上面评论的答案。不过,很高兴知道它有一个简单的列表理解!编辑:哦,没关系!你是对的;当我复制并粘贴它来玩它时,我没有将关键字列表更改为其他内容。将其更改为 list_[:] + [elem] for list_ ... 成功了。
      • 很高兴它已排序。虽然'list'关键字在for循环的定义中被覆盖(覆盖?),所以应该没关系。此外,使用 [:] 或不使用不会改变任何内容,因为两者都返回列表的副本,并且表达式会导致两个列表的连接。我怀疑你在运行理解之前有一个填充的“list3”。否则我会有点难过!
      猜你喜欢
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 2013-09-10
      • 2020-08-04
      • 2011-01-28
      • 1970-01-01
      • 2020-06-22
      • 2019-02-27
      相关资源
      最近更新 更多