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中的字符串之间打印一些额外的东西?
如何从Combiner/Reducer/Aggregator 函数返回具有多个字段的元组?