是否可以使用列表解析来解压缩元组列表?

时间:2017-10-27 14:16:07

标签: python-3.x list-comprehension

我想使用列表解析将元组列表中的元组解压缩为单个变量。例如。如何使用列表推导而不是显式循环进行第二次打印:

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

是否可以通过列表理解来替换第二个打印循环? 如果合适,请随意进一步简化。

1 个答案:

答案 0 :(得分:1)

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