2017-09-08 13 views
1

リストの理解度を使って以下のコードをどのように行うことができますか?私はこれらの例を見てきましたが、わかりません。リスト理解の例

Python: Removing list element while iterating over list

list_dicts = [{'site': 'living', 'status': 'ready' }, {'site': 'keg', 
'status': 'ready' }, {'site': 'box', 'status': 'ready' }, {'site': 'wine', 
'status': 'not_ready' }] 

def call_some_func(m_site_dict): 
    print "I executed the 'call_something_function'" 

for site in list_dicts[:]: 
    if site['status'] == 'ready': 
     call_some_func(site) 
     list_dicts.remove(site) 
+0

'list_dicts = [{「サイト」:サイト、「ステータス」:!「準備」サイトの場合= ['living'、 'keg'、 'box'、 'wine']のサイトでは 'wine' else 'not_ready'}] 'しかし、あなたが持っているものを正確に書くことに注意してください。 –

+4

forループの代わりにリスト内包表記をどのように使用すればいいのか分かりません。リスト内包表記は、forループのドロップイン置換ではなく、簡潔にリストを作成する方法です。 –

+0

@AdamSmithああ、ありがとう。 – Hound

答えて

1

あなたが副作用(現在印刷)との関数呼び出しを行っているので、ループのためにこれを置き換えるために素晴らしいアイデアではありません。あなたは、例えば(delためO(n)append()ためO(1))よりパフォーマンスだろうこれは、新しいリストを構築するためにelse節を使用することができます。

In []: 
new_list_dicts = [] 
for site in list_dicts: 
    if site['status'] == 'ready': 
     call_some_func(site) 
    else: 
     new_list_dicts.append(site) 
new_list_dicts 

Out[]: 
I executed the 'call_something_function' 
I executed the 'call_something_function' 
I executed the 'call_something_function' 

[{'site': 'wine', 'status': 'not_ready'}] 

ただ、デモ(しかし非常に悪い形)として、あなたがこれを行うことができますリスト内包が、それは短絡し、事実False考えられているcall_some_func()戻りNoneに依存しています:

In []: 
[site for site in list_dicts if site['status'] == 'ready' and 
call_some_func(site) or site['status'] != 'ready'] 

Out[]: 
I executed the 'call_something_function' 
I executed the 'call_something_function' 
I executed the 'call_something_function' 

[{'site': 'wine', 'status': 'not_ready'}]