我想使用列表解析将元组列表中的元组解压缩为单个变量。例如。如何使用列表推导而不是显式循环进行第二次打印:
tuples = [(2, 4), (3, 9), (4, 16)]
# Print in direct order OK
print(('Squares:' + ' {} --> {}' * len(tuples)).format(
*[v for t in tuples for v in t]))
# Print in reverse order not possible
print('Square roots:', end='')
for t in tuples:
print (' {} --> {}'.format(t[1], t[0]), end='')
print()
>>> Squares: 2 --> 4 3 --> 9 4 --> 16
>>> Square roots: 4 --> 2 9 --> 3 16 --> 4
是否可以通过列表理解来替换第二个打印循环? 如果合适,请随意进一步简化。
答案 0 :(得分:1)
在python-3.x print
中是一个函数,所以你确实可以写:
[print (' {} --> {}'.format(*t[::-1]), end='') for t in tuples]
但这可能比使用for
循环更糟糕,因为现在您为每次迭代分配内存。如果迭代次数很多,您将构建一个填充None
s。
它产生:
>>> tuples = [(2, 4), (3, 9), (4, 16)]
>>> [print (' {} --> {}'.format(*t[::-1]), end='') for t in tuples]
4 --> 2 9 --> 3 16 --> 4[None, None, None]
不打印[None, None, None]
,而只打印列表推导的结果。
但话虽如此,我们不需要列表理解,我们可以使用''.join(..)
(使用列表或生成器`,如:
print('Squares:'+''.join(' {} --> {}'.format(*t) for t in tuples))
print('Square roots:'+''.join(' {} --> {}'.format(*t[::-1]) for t in tuples))
这会产生:
>>> print('Squares:'+''.join(' {} --> {}'.format(*t) for t in tuples))
Squares: 2 --> 4 3 --> 9 4 --> 16
>>> print('Square roots:'+''.join(' {} --> {}'.format(*t[::-1]) for t in tuples))
Square roots: 4 --> 2 9 --> 3 16 --> 4