Python 函数正在创建一个额外的元组

Posted

技术标签:

【中文标题】Python 函数正在创建一个额外的元组【英文标题】:Python function is creating an extra tuple 【发布时间】:2017-03-23 06:42:00 【问题描述】:

我的原始函数基于this post、this post 和this post。但它不起作用。我得到的主要问题是,即使我将 tuple(c) 放在示例二中,我仍然会得到一个列表。

我有两个示例,一个带有嵌套元组(应该是这样),另一个带有列表中的嵌套元组,这样您就可以很容易地看到额外的附件,因为嵌套元组的括号太多。

def example_one():
    list_one = ((1, 2), (3, 4), (5, 6), (7, 8), (9, 10))
    list_two = []
    print "List One: " + str(list_one)      
    for i in range(0, 5):
        c_tuple = tuple(c for c in itertools.combinations(list_one[:i], i))
        list_two.append(c_tuple)
    list_two = tuple(list_two)
    print "List Two: " + str(list_two)

输出:

List One: ((1, 2), (3, 4), (5, 6), (7, 8), (9, 10))
List Two: (((),), (((1, 2),),), (((1, 2), (3, 4)),), (((1, 2), (3, 4), (5, 6)),), (((1, 2), (3, 4), (5, 6), (7, 8)),))

def example_two():
    list_one = ((1, 2), (3, 4), (5, 6), (7, 8), (9, 10))
    list_two = []
    print "List One: " + str(list_one)      
    for i in range(0, 5):
       c_tuple = [tuple(c) for c in itertools.combinations(list_one[:i], i)]
       list_two.append(c_tuple)
    list_two = tuple(list_two)
    print "List Two: " + str(list_two)

输出:

List One: ((1, 2), (3, 4), (5, 6), (7, 8), (9, 10))
List Two: ([()], [((1, 2),)], [((1, 2), (3, 4))], [((1, 2), (3, 4), (5, 6))], [((1, 2), (3, 4), (5, 6), (7, 8))])

在第二个示例中,括号表示示例一中我要消除的元组。事实上,老实说,我不确定是那个元组还是里面的那个。我猜哪个是不必要的添加。

期望的输出:

List One: ((1, 2), (3, 4), (5, 6), (7, 8), (9, 10))
List Two: ((()), ((1, 2)), ((1, 2), (3, 4)), ((1, 2), (3, 4), (5, 6)), ((1, 2), (3, 4), (5, 6), (7, 8)))

【问题讨论】:

【参考方案1】:

正如您所提到的,您可以避免使用[tuple(c) for c in iterable],而只需执行以下操作。 (也简化/缩小了很多东西)

>>> list_one = ((1, 2), (3, 4), (5, 6), (7, 8), (9, 10))
>>> list_two = []
>>> print "List One: ", list_one
List One:  ((1, 2), (3, 4), (5, 6), (7, 8), (9, 10))
>>> list_two = tuple(
...     c for i in range(0, 5)
...     for c in itertools.combinations(list_one[:i], i)
... )
>>> print "List Two: ", list_two
List Two:  ((), ((1, 2),), ((1, 2), (3, 4)), ((1, 2), (3, 4), (5, 6)), ((1, 2), (3, 4), (5, 6), (7, 8)))

【讨论】:

不,它不是一开始我试图摆脱的空元组:它应该在那里。我试图摆脱包装第二个包装元组的额外元组。例如:(()), ((1, 2)), ((2, 3), (3, 4))... 是好的。我得到: ((())), (((1, 2))), (((2, 3), (3, 4)))... 我相信如果 [tuple(c) for c in iterable] 返回 tuple(c) 而不是 list(c),这个问题本来可以避免。否则我读错了输出。 是的,正在更新我的答案。 在有问题的帖子中放置所需的输出。不清楚。 在您的示例输出中,第二个元素 (1, 2) 周围仍然有 3 组括号。第一个也是如此。应该只有两套。但我喜欢你的另一个重构。【参考方案2】:

在您的第二个示例中,您将嵌套元组添加到列表中,将这些列表附加到一个大列表中,最后将该大列表转换为一个元组。 这就是为什么您要在元组中获取列表

创建列表的行是

c_tuple = [tuple(c) for c in itertools.combinations(list_one[:i], i)]

如果你有方括号,它只会返回一个列表

【讨论】:

去掉方括号【参考方案3】:

在将 c_tuple 添加到 list_two 时,您必须使用 extend 而不是 append!

要清楚了解两者之间的区别,请查看this

import itertools

def example_two():
    list_one = ((1, 2), (3, 4), (5, 6), (7, 8), (9, 10))
    list_two = []
    print "List One: " + str(list_one)      
    for i in range(0, 5):
       c_tuple = [tuple(c) for c in itertools.combinations(list_one[:i], i)]
       list_two.extend(c_tuple) #here instead of append use extend!
    list_two = tuple(list_two)
    print "List Two: " + str(list_two)

输出:

List One: ((1, 2), (3, 4), (5, 6), (7, 8), (9, 10))
List Two: ((), ((1, 2),), ((1, 2), (3, 4)), ((1, 2), (3, 4), (5, 6)), ((1, 2), (3, 4), (5, 6), (7, 8)))

希望对你有帮助!

【讨论】:

以上是关于Python 函数正在创建一个额外的元组的主要内容,如果未能解决你的问题,请参考以下文章

如何删除一些额外的元组和列表并在python中的字符串之间打印一些额外的东西?

Python中的元组(Tuple)

关于python的元组操作

如何从Combiner/Reducer/Aggregator 函数返回具有多个字段的元组?

Python:扁平化包含来自函数的另一个元组的元组的最简单方法

Python基本数据类型(元组)