Python:在列表推导中重复元素?

4 投票
3 回答
4285 浏览
提问于 2025-04-15 22:46

我有一个列表推导式,它可以为每个地点返回一组坐标对象。

coordinate_list = [Coordinates(location.latitude, location.longitude)
                   for location in locations]

这个方法是有效的。

现在假设地点对象有一个叫做 number_of_times 的属性。我想用列表推导式生成 n 个坐标对象,其中 n 就是该地点的 number_of_times 值。也就是说,如果一个地点的 number_of_times = 5,那么这个地点的坐标在列表中会出现 5 次。(也许这可以用 for 循环来实现,但我想知道是否可以通过列表推导式来完成)

3 个回答

0

你可以把一个序列乘以一个数字,比如说 number_of_times 的值。所以 [1,2]*3 就等于 [1, 2, 1, 2, 1, 2]。如果你把坐标放在一个列表里,然后把这个列表乘以重复的次数,你得到的结果应该是 [coord, coord, coord]。

def coordsFor(location):
   return coord = [Coordinates(location.latitude, location.longitude) ]*location.number_of_times

把列表中每个元素的 coordsFor 连接起来。

reduce(operator.add, map(coordsFor, locations), [])
6

试试看

coordinate_list = [Coordinates(location.latitude, location.longitude)
                   for location in locations 
                   for i in range(location.number_of_times)]
7
coordinate_list = [x for location in locations
                   for x in [Coordinates(location.latitude,
                                         location.longitude)
                            ] * location.number_of_times]

编辑: 原作者提到使用循环可能会更清晰,考虑到标识符的长度,这确实是个不错的选择。那么相应的代码可能会像这样:

coordinate_list = [ ]
for location in locations:
    coord = Coordinates(location.latitude, location.longitude)
    coordinate_list.extend([coord] * location.number_of_times)

这个循环看起来不错,部分原因是列表的 extend 方法在这里很好用,另外一个原因是你可以给你正在扩展的 Coordinate 实例起个名字。

撰写回答