2016-11-05 98 views
0

給出的播放列表:的Python - 簡化代碼列表理解

energy_playlist = [{u'track': u'Nude', u'feature': u'energy', u'value': 0.342, u'artist': u'Radiohead'}, {u'track': u'Kaleidoscope', u'feature': u'energy', u'value': 0.285, u'artist': u'Coldplay'}, {u'track': u'Faust Arp', u'feature': u'energy', u'value': 0.289, u'artist': u'Radiohead'}, {u'track': u'Running Up That Hill', u'feature': u'energy', u'value': 0.356, u'artist': u'Placebo'}, {u'track': u'Codex', u'feature': u'energy', u'value': 0.128, u'artist': u'Radiohead'}, {u'track': u'True Love Waits', u'feature': u'energy', u'value': 0.132, u'artist': u'Radiohead'}, {u'track': u'Asleep - 2011 Remastered Version', u'feature': u'energy', u'value': 0.255, u'artist': u'The Smiths'}, {u'track': u'Glass Eyes', u'feature': u'energy', u'value': 0.11, u'artist': u'Radiohead'}, {u'track': u'Pyramid Song', u'feature': u'energy', u'value': 0.335, u'artist': u'Radiohead'}, {u'track': u'Life On Mars? - 2015 Remastered Version', u'feature': u'energy', u'value': 0.384, u'artist': u'David Bowie'}, {u'track': u'Exit Music (For a Film)', u'feature': u'energy', u'value': 0.276, u'artist': u'Radiohead'}, {u'track': u'Videotape', u'feature': u'energy', u'value': 0.384, u'artist': u'Radiohead'}, {u'track': u'High And Dry', u'feature': u'energy', u'value': 0.383, u'artist': u'Radiohead'}] 

tempo_playlist = [{u'track': u'Codex', u'feature': u'tempo', u'value': 58.993, u'artist': u'Radiohead'}, {u'track': u'Pyramid Song', u'feature': u'tempo', u'value': 77.078, u'artist': u'Radiohead'}, {u'track': u'Videotape', u'feature': u'tempo', u'value': 77.412, u'artist': u'Radiohead'}] 

我能找到這樣的匹配tracks

for d1 in energy_playlist: 
    for d2 in tempo_playlist: 
     if d1['track'] == d2['track']: 
      print (d2['track']) 

如何管理在一行中使用list comprehension做相同的操作,分配給variablefinal_playlist

+0

不能在列表理解 –

+0

我知道打印,但我可以把它分配給一個變量,並打印出來,對不對? –

+0

你可以把理解分配給一個變量,是的。你有沒有試過寫這個? –

回答

2

你的整個代碼轉換成列表解析

final_playlist = [d2['track'] for d1 in energy_playlist for d2 in tempo_playlist if d1['track'] == d2['track']] 
2

這有幫助嗎?

energy_tracks = [p["track"] for p in energy_playlist] 
tempo_tracks = [p["track"] for p in tempo_playlist] 

print set(energy_tracks).intersection(tempo_tracks) 

好吧,在一行中,你現在想要它:-D?我問爲什麼,只是爲了好玩...

result = set(p["track"] for p in energy_playlist).intersection(p["track"] for p in tempo_playlist) 

其實,這一個班輪是也許有點比三班輪更快以上,作爲曲目的清單中沒有明確保存在內存中,但作爲set對象使用的迭代器。

+0

V我正在考慮單個列表comphreension。 –

+0

好的,對不起,這是我在下午1點多拿到的:-D。現在我不知道如何把它變成一種理解。祝你好運。 –

2

在這裏你去:

[x['track'] for x in tempo_playlist if x['track'] in [y['track'] for y in energy_playlist]] 

雖然我與其他人在一條線惡補同意比多行的可讀性。

+0

多數民衆贊成在我正在尋找,謝謝 –

+0

現在'temp_playlist'中的每個x現在將執行'[y ['track'] for energy_playlist]'?這樣會比較慢,儘管顯然你已經理解了它。我相信我的速度要快得多,但我可能是錯的。 :-)。 –

+0

我知道,儘管如此,我試圖訓練我的可讀性,並且學會在一行中閱讀它,在腦中創造出不同的突觸.. :-D –

1

除了一)你的代碼的可讀性,所以看不到一條線的需要,但最重要的B)一個襯墊不能真正改善性能:)...讓我證明:

import timeit 

energy_playlist = [{u'track': u'Nude', u'feature': u'energy', u'value': 0.342, u'artist': u'Radiohead'}, {u'track': u'Kaleidoscope', u'feature': u'energy', u'value': 0.285, u'artist': u'Coldplay'}, {u'track': u'Faust Arp', u'feature': u'energy', u'value': 0.289, u'artist': u'Radiohead'}, {u'track': u'Running Up That Hill', u'feature': u'energy', u'value': 0.356, u'artist': u'Placebo'}, {u'track': u'Codex', u'feature': u'energy', u'value': 0.128, u'artist': u'Radiohead'}, {u'track': u'True Love Waits', u'feature': u'energy', u'value': 0.132, u'artist': u'Radiohead'}, {u'track': u'Asleep - 2011 Remastered Version', u'feature': u'energy', u'value': 0.255, u'artist': u'The Smiths'}, {u'track': u'Glass Eyes', u'feature': u'energy', u'value': 0.11, u'artist': u'Radiohead'}, {u'track': u'Pyramid Song', u'feature': u'energy', u'value': 0.335, u'artist': u'Radiohead'}, {u'track': u'Life On Mars? - 2015 Remastered Version', u'feature': u'energy', u'value': 0.384, u'artist': u'David Bowie'}, {u'track': u'Exit Music (For a Film)', u'feature': u'energy', u'value': 0.276, u'artist': u'Radiohead'}, {u'track': u'Videotape', u'feature': u'energy', u'value': 0.384, u'artist': u'Radiohead'}, {u'track': u'High And Dry', u'feature': u'energy', u'value': 0.383, u'artist': u'Radiohead'}] 
tempo_playlist = [{u'track': u'Codex', u'feature': u'tempo', u'value': 58.993, u'artist': u'Radiohead'}, {u'track': u'Pyramid Song', u'feature': u'tempo', u'value': 77.078, u'artist': u'Radiohead'}, {u'track': u'Videotape', u'feature': u'tempo', u'value': 77.412, u'artist': u'Radiohead'}] 

def foo1(): 
    ret = [] 
    for d1 in energy_playlist: 
     for d2 in tempo_playlist: 
      if d1['track'] == d2['track']: 
       ret.append(d1["track"]) 
    return ret 

def foo2(): 
    ret = [] 
    for d1 in energy_playlist: 
     for d2 in tempo_playlist: 
      if d1['track'] == d2['track']: 
       pass 
    return None 

def foo3(): 
    return [d2['track'] for d1 in energy_playlist for d2 in tempo_playlist if d1['track'] == d2['track']] 


def bar(): 
    tempo_tracks = [i["track"] for i in tempo_playlist] 
    return [i["track"] for i in energy_playlist if i["track"] in tempo_tracks] 

print("foo1:", timeit.timeit(foo1)) 
print("foo2:", timeit.timeit(foo2)) 
print("foo3:", timeit.timeit(foo3)) 
print("bar:", timeit.timeit(bar)) 

# foo1: 5.550314342981437 
# foo2: 5.025758317991858 
# foo3: 5.3763819159939885 
# bar: 2.86007208598312