如何在不放入列表的情况下处理单行for循环?

1 投票
6 回答
4287 浏览
提问于 2025-04-16 03:02

可能这个问题有点模糊,但我想表达的是这段代码:

'livestream' : [cow.legnames for cow in listofcows]

现在的问题是,cow.legnames也是一个列表,所以当我尝试用Json返回它时,会得到一个列表里的列表。我应该怎么做才能返回一个单一的列表呢?

这是将要返回的Json:

'livestream' : [['blue leg', 'red leg']]

我希望这段代码能解释我的问题是什么。

6 个回答

1

根据我的理解,你的代码大概是这样的:

class Cow(object):
    def __init__(self, legnames):
        self.legnames = legnames

listofcows = [Cow(['Red Leg', 'Blue Leg']), 
              Cow(['Green Leg', 'Red Leg'])]

最简单的方法是扩展一个临时的列表,像这样:

legs = []

# As @delnan noted, its generally a bad idea to use a list
# comprehension to modify something else, so use a for loop
# instead.
for cow in listofcows:
    legs.extend(cow.legnames)


# Now use the temporary legs list...
print {'livestream':legs}
2

这个名字 listofcows 暗示着将来可能会有很多牛。如果把一个包含多个项目的列表压平,那就不太对了。

不过,如果这个名字让人误解了(而且为什么要有一个只有一个元素的列表呢?),你有几种方法可以把它压平。

一种方法是使用嵌套的列表推导式: [legname for cow in listofcows cow.legnames for legname in cow.legnames]

另一种方法是获取第一个项目: [your list comprehension][0]

还有可能有一些我现在想不起来的标准库里的有用工具。

10

除了shahjapan提到的reduce方法,你还可以使用这种语法来把列表变得扁平。

[legname for cow in listofcows for legname in cow.legnames]

撰写回答