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)]
我想要一个简短而明确的解决方案。
*请注意,我不想使用任何extend
或append
来合并这些列表,因为我需要这么多元组
答案 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)