【问题标题】:Python: Merge lists within tuples OR combining lists within lists within lists without itertools and thus tuple objectPython:合并元组中的列表或在没有itertools的列表中组合列表中的列表,因此没有元组对象
【发布时间】:2016-04-05 12:50:54
【问题描述】:

我有一个列表,其中包含包含列表的元组。像这样:

my_list = [(
    [A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17],
    [B1, B2, B3, B4, B5, B6],
    [C1, C2, C3, C4, C5]
),
(
    [A1a, A2a, ......],
    [B1a, B2a....],
    [C1a, C2a....,]
), ........ *27]

从每个元组中,我想将前三个列表中的项目组合起来,所以 A1...C5 到熊猫 DataFrame 因为我需要用它们进行计算。但是我不知道如何对这个对象进行迭代(例如,将项目附加到一个新列表中)并且在此失败。

我之所以以我的方式获得my_list,是因为我想组合一个列表列表。所以想转my_previous_list

my_previous_list = [[[a1a, a2a,..,], [a1b, a2b,...,], [a1c, a2c,...,]],
    [[b1a, b2a,..,], [b1b, b2b,...,], [b1c, b2c,...,]], [[c1a, c2a,..,],
    [c1b, c2b,...,], [c1c, c2c,...,]]]

到一个包含 27 个列表 (3*3*3) 的新列表中:

[
[a1a, a2a..., b1a, b2a..., c1a, c2a...,],
[a1a, a2a..., b1a, b2a..., c1b, c2b...,] ,
[a1a, a2a..., b1b, b2b..., c1b, c2b...,],
[a1b, a2b..., b1a, b2a..., c1a, c2a...,] ........ *27] 

我用过:

my_list = list(itertools.product(*my_previous_list)

得到我的结果。

有谁知道如何合并元组中的列表并将它们转换为数据框?或者如何使用与我采用的 itertools 方法不同的方法来绕过这个问题。

【问题讨论】:

  • 您能否更好地格式化您的问题,以便非常清楚您拥有的数据是什么以及预期的结果是什么?
  • 首先感谢 Chris 编辑我的问题。现在看起来更合适了。关于@Walter_Ritzel:数据是代表备用容量市场(电力拍卖)中增量容量报价的投标值的数值。我需要将这些值与我设计的单独市场清算模型中的变量结合起来。希望这能回答你的问题
  • 也许是我,但我还是不明白你现在的状态和你想要的状态是什么……太多了……在例子中。有一个简短的完整示例会很有用,因此我们可以评估您的需求。我要说的是:在你的例子中,虽然 [c1c, c2c,...,] 在你的源代码中,但它没有出现在你的目标文件中......

标签: python list python-3.x tuples itertools


【解决方案1】:

如果我理解正确,这就是你需要的:

import pprint

my_previous_list = [[['a1a','a2a','a3a'], ['a1b','a2b','a3b'], ['a1c','a2c','a3c']],[['b1a','b2a','b3a'],['b1b','b2b','b3b'],['b1c','b2c','b3c']],[['c1a','c2a','c3a'],['c1b','c2b','c3b'],['c1c','c2c','c3c']]]

print('Original')
pprint.pprint(my_previous_list)

all_lists = []
for a in my_previous_list[0]:
    for b in my_previous_list[1]:
        for c in my_previous_list[2]:
            line = []
            line.append(a + b + c)
            all_lists.append(line)

print('Processed')
pprint.pprint(all_lists)

这不是 Python 代码,但这是我尝试理解您的问题的唯一方法。

【讨论】:

  • 尽管对问题的解释可能有些模糊,但我仍然得到了我正在寻找的答案。非常感谢@Walter_Ritzel,由于您的帮助,这位学生将更快地获得硕士学位
【解决方案2】:

可以这样实现

def g():
    for t in zip(*my_old_list):
        yield (e for l in t for e in l)
my_new_list = [list(l) for l in g()]

看看它是否有效。也可以这样写。

my_new_list = [[e for l in t for e in l] for t in zip(*my_old_list)]

Bdw,在处理大型计算时,始终使用迭代器而不是列表。如果你一直在使用迭代器,你永远不会得到my_old_list

【讨论】:

  • 感谢您的帮助#C Panda,这不是我所需要的,但对帮助我达成最终解决方案仍然很有帮助。通过使用迭代器来规避列表的使用绝对是正确的,但由于我仍然是一个初级程序员,我不知道该怎么做。我的目标其实很简单,但是我现在使用的代码真的很脏。无论如何感谢您的帮助!
  • 你应该做什么取决于手头的问题。但是您可以先用()(生成器表达式)替换外部[](列表组合)。您使用生成器越多,您的代码就越声明性,这在数据处理中是一件非常非常好的事情。声明式代码看起来像 unix shell 中的流水线。
猜你喜欢
  • 1970-01-01
  • 2016-10-08
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 2014-06-23
相关资源
最近更新 更多