如何处理一行for循环而不将其放入List中?

时间:2010-08-19 17:11:36

标签: python

也许问题有点模糊,但我的意思是这段代码:

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

现在问题是cow.legnames也是一个列表,所以当我尝试用Json返回它时,我会在列表中得到一个列表。如何让它返回单个列表。

这是将要返回的json。

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

我希望代码能解释我的问题。

5 个答案:

答案 0 :(得分:9)

除了shahjapan的reduce之外,您还可以使用此语法来展平列表。

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

答案 1 :(得分:2)

名称listofcows暗示可能在遥远的未来可能有几头奶牛。使用多个项目展平列表列表是完全错误的。

但是,如果该名称具有误导性(为什么还有一个单一列表,那么就此而言?),你有几种方法可以将它弄平。

嵌套列表理解:[legname for cow in listofcows cow.legnames for legname in cow.legnames]

获取第一项:[your list comprehension][0]

很可能是我现在不记得的标准库中的一些有用的东西。

答案 2 :(得分: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}

答案 3 :(得分:0)

这是你要找的吗?

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

答案 4 :(得分:0)

你可以尝试减少,
'livestream' : reduce(lambda a,b:a+b,[cow.legs for cow in listofcows])

如果你需要独特的腿使用套装

'livestream' :list(set(reduce(lambda a,b:a+b,[cow.legs for cow in listofcows])))