2010-08-19 19 views
2

也許問題有點模糊,但我的意思是這樣的代碼:如何處理一行循環而不將其放入列表中?

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

現在的問題是cow.legnames也是一個列表,所以我會得到一個名單列表中,當我嘗試返回它與Json。我應該如何使它返回一個列表。

這是將被返回的json。

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

我希望代碼解釋我的問題是什麼。

+3

爲了不太模糊,你舉一個關於命名你的牛的腿的例子嗎? – 2010-08-19 17:29:26

+0

您的語法'string_constant:list_comprehension'是特有的;這是一個字典中的項目?爲了避免疑問,如果您至少給出了一個語法正確的語句而非片段,這將非常有幫助。 – 2010-08-19 19:51:50

回答

9

除了shahjapan的減少,你可以使用這個語法來拉平列表。

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

+1也打我吧。 – aaronasterling 2010-08-19 18:52:50

+0

我沒有時間測試這個答案了。但我猜這是正確的答案。我會盡快接受你的答案,但我現在很忙。儘管感謝您的回答。欣賞它。 – 2010-08-24 16:22:33

+0

完美的作品。這是我想要這樣做的方式。不知道我能在一行中做2循環;) – 2010-08-29 16:03:31

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} 
+1

帶副作用的列表理解已經夠糟糕了,但僅僅爲了副作用的列表理解是簡單而不可靠的。使用for循環。 – delnan 2010-08-19 17:21:48

+0

@delnan - 我同意,但我試圖反映OP在做什麼以使事情更清楚。 – 2010-08-19 17:24:12

+0

編輯並說明這是一個糟糕的主意,只是一個例子,我將undownvote :) – delnan 2010-08-19 17:25:28

2

名稱listofcows意味着可能出現,有可能未來,幾頭奶牛。用一個以上的項目壓扁列表將是錯誤的。

但是,如果名稱具有誤導性(爲什麼還要列出一個單子列表?),您有幾個選項可以使它變平。

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

獲得的第一項:[your list comprehension][0]

而且很可能一些有用的啄標準庫中我不記得現在。

+1

至於「有用的東西」,我認爲你正在考慮'sum(nested_list,[])' – 2010-08-19 17:47:20

0

這是你在找什麼?

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

不,看起來Joe的答案是最合適的,因爲在這裏使用理解列表不太好。 – 2010-08-19 17:44:42

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])))