2009-06-02 24 views
3

好吧,讓我說我有一個列表,我想檢查列表是否存在於另一個列表中。我可以做,這樣做:使用列表解析和例外?

all(value in some_map for value in required_values) 

,工作正常,但可以說我要加薪時所需的值丟失,與它缺少值異常。我怎樣才能使用列表理解?

我或多或少好奇,所有的跡象似乎指向不。

編輯哎呀我的意思是這樣的:

for value in required_values: 
if value not in some_map: 
    raise somecustomException(value) 

看着那些我不能看到我怎麼能找到發生錯誤的

+0

非常相似:http://stackoverflow.com/questions/1528237/how-can-i-handle-exceptions-in-a-list-comprehension-in-python – 2012-05-08 18:58:31

回答

14

可以說我想提出一個例外,當缺少一個需要的值,缺少值。我怎樣才能使用列表理解?

列表理解是創建基於一些現有的列表上,噹噹在一行中寫任何for -loop的通用方式列表的語法簡潔的方式。在這個例子中,你實際上並沒有創建一個列表,所以使用列表理解沒有任何意義。

+2

+1「不要濫用列表解析」 – Soviut 2009-06-02 18:22:10

+0

我現在同意我已經更多地瞭解它。謝謝。 – UberJumper 2009-06-02 18:50:50

2

值。如果你不想考慮重複和值是可散列的,使用集合。他們更容易,更快,並且可以提取「所有」的元素在一次操作中丟失:

required_values = set('abc') # store this as a set from the beginning 
values = set('ab') 
missing = required_values - values 
if missing: 
    raise SomeException('The values %r are not in %r' % 
         (missing, required_values)) 
+1

不應該是`missing = required_values - 值`? – 2009-06-02 17:48:42

-2

雖然我想用套(如nosklo的例子)是更好的,你可以做一些簡單的像這樣:

def has_required(some_map, value): 
    if not value in some_map: 
    raise RequiredException('Missing required value: %s' % value) 

all(has_required(some_map, value) for value in required_values) 
0

另一個(醜陋的)可能性將是error_on_false功能:

def error_on_false(value) 
    if value: 
     return value 
    else: 
     raise Exception('Wrong value: %r' % value) 

if all(error_on_false(value in some_map) for value in required_values): 
    continue_code() 
    do_something('...') 

這很醜陋。我會用set來代替。

0

我在想今晚。我的用例在對象列表上迭代,並在對象不是特定類型時產生錯誤。我的解決方案是使用發電機。

def iter_my_class(my_class_list): 
    for c in my_class_list: 
     if not isinstance(c, MyClass): 
      raise ValueError('Expected MyClass') 
     yield c 

然後用作

classes = [c for c in iter_my_class(my_class_list)] 

我寫這我的手機上。如果沒有錯誤,你們都欠我一杯啤酒。