Python以非列表形式生成和返回元组

时间:2016-09-04 08:19:20

标签: python arrays list tuples

def tuple_gen(x, y, num):
    pos = []
    for i in range(num):
        x += 1
        pos.append([x, y])
        pos[i] = tuple(pos[i])
    return pos

我的意见是:

>>> tuple_gen(0,1,5)
[(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]

我想要的是返回元组而不是列表:

>>> tuple_gen(0,1,5)
(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)

因为我想形成一个包含不同类型元组的列表:

>>> [tuple_gen(0,1,5), tuple_gen(0,2,6)]
[(1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (1, 2), (2, 2), (3, 2), (4, 2), (5, 2), (6, 2)]

我想要一个简短而明确的解决方案。

*请注意,我不想使用任何extendappend来合并这些列表,因为我需要这么多元组

4 个答案:

答案 0 :(得分:1)

您目前正在返回元组列表:

>>> tuple_gen(0,1,5)
[(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]

你可以使用return tuple(pos)返回一个元组元组。

这就是你要求的,但对于这个用例它不会帮助你:

[tuple_gen(0,1,5), tuple_gen(0,2,6)]

这仍然是两个元组元组的列表。

你真正需要的是像你一样返回一个列表,然后再连接这些列表:

tuple_gen(0,1,5) + tuple_gen(0,2,6)

答案 1 :(得分:1)

你完全不能像你说的那样做,但你有一些选择,首先是链接你的功能结果:

>>> a = [(1, 1), (2, 1)]
>>> b = [(3, 1), (4, 1), (5, 1)]
>>> 
>>> a + b
[(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]
>>> # Or using itertools.chain
>>> from itertools import chain
>>> 
>>> list(chain(a, b))
[(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]

其次,如果你在python3.5 +中,你可以使用高级解包:

>>> a = [(1, 1), (2, 1)]
>>> b = [(3, 1), (4, 1), (5, 1)]
>>> [*a, *b]
[(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]

您可以执行哪些功能:

[*tuple_gen(0,1,5), *tuple_gen(0,2,6)]

答案 2 :(得分:0)

你需要一个容器,它可以容纳你的元组。您正在考虑列表或方案,如元组,它们是链表。 python中的元组在创建,连接和追加方面都很昂贵。您应该使用列表来实现此目的。您可以列出一个列表然后加入。

tuple_gen(0,1,5) + tuple_gen(0,2,6)

或者你可以将你的元组加入你的gen函数。

def tuple_gen(x, y, num):
    for i in range(num):
        x += 1
        yield (x,y)

x = []
for i in tuple_gen(0,1,5):
    x.append(i)

for i in tuple_gen(0,2,6):
    x.append(i)

python还有其他容器 - 甚至是链表。几乎所有都被实现为一个带有一些附加功能的列表。

答案 3 :(得分:0)

您只需要更改调用tuple_gen的方式即可。这是一个示例,稍微改进了tuple_gen的版本:

def tuple_gen(x, y, num):
    pos = []
    for i in range(num):
        x += 1
        pos.append((x, y))
    return pos

bases = (
    (0, 1, 5), 
    (0, 2, 6),
)

a = [t for args in bases for t in tuple_gen(*args)] 
print(a)

<强>输出

[(1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (1, 2), (2, 2), (3, 2), (4, 2), (5, 2), (6, 2)]

另一种方法是创建一个生成所有所需元组的生成器:

def make_tuples(bases):
    for x, y, num in bases:
        yield from ((i, y) for i in range(x + 1, num + x + 1))

bases = (
    (0, 1, 5), 
    (0, 2, 6),
)

a = list(make_tuples(bases))
print(a)

根据您的实际需要,您可以避免创建列表(从而节省RAM),并在创建时使用元组。例如,

for t in make_tuples(bases):
    print(t)

<强>输出

(1, 1)
(2, 1)
(3, 1)
(4, 1)
(5, 1)
(1, 2)
(2, 2)
(3, 2)
(4, 2)
(5, 2)
(6, 2)