2011-12-19 60 views
2

我有這樣的列表:listvalues = [True, True, False, True, False, 24, somestring, 50] 所以列表的前五個元素是布爾值,其餘的是字符串和整數。 現在我想檢查前五個元素,如果他們是真或假,如果他們是真的,我想要使用某種方法,具體取決於元素的索引。 因此,在上面的情況下,應該爲第一個元素(索引0)做一個動作,然後對第二個元素(索引1)做另一個動作,然後對第四個元素執行另一個動作。 如果所有的布爾值都是錯誤的,則會出現警告。 對不起,noob問題,但我無法找到自己短暫而簡單的解決方案...Python:如何只訪問一個帶有循環的列表的布爾元素?

+3

我會建議這種方法存在一個基本問題,它不會產生好的代碼。您可以嘗試用面嚮對象的技術來解決這個問題。 – 2011-12-19 22:15:13

+0

查看'enumerate'的文檔。如果這不是什麼讓你煩惱的話,可以考慮添加一些關於你所嘗試的內容的細節,以及你無法弄清楚的內容。 – 2011-12-19 22:15:48

+0

它是'listvalues = [true,true,false,true,false,24,「somestring」,50]' – 2011-12-19 22:16:29

回答

3

有許多的東西,這可能有助於在這裏。首先,你應該使用列表切片來隔離布爾值。如果你知道前5個元素是你所追求的,那麼myList[0:5]將會得到那些並忽略其他元素。

接下來,看看any函數。它會返回True如果任何元素是真實的,所以你可以這樣做,以決定是否需要發出警告:

if not any(myList[0:5]): 
    # Code here to issue the warning. 

接下來,對付它的功能是打電話,你可能會想是這樣的:

funcList = [f0, f1, f2, f3, f4] 
for idx, test in enumerate(myList[0:5]): 
    if test: funcList[idx]() 

理想的情況下,雖然,有什麼可能會更好地工作將是把個別函數的引用在原來的列表,而不是布爾值,與無的價值,如果你想跳過功能。您原來的名單將最終看起來像這樣:

myList = [f1, f2, None, f3, None, 24, "string", 50] 

要打電話要叫你做的那些:

for func in myList[0:5]: 
    if func is not None: func() 
+0

非常感謝,切片在這裏是非常有用的,我不知道任何功能:) – user1106770 2011-12-31 02:08:20

1
all_false = True 
for x in yourlist: 
    if x is True: 
     # call some method 
     # ... 
     all_false = False 

if all_false: 
    # print warning 
1

鑑於您已經定義要應用於每個個案的功能,你可以把它們放在一個列表在迴路中調用它們

perform = [func1, func2, func3, func4, func5] 

if not any(listvalues[:5]): raise Exception 

for index in range(5): 
    if listvalues[index]: 
     func = perform[index] 
     func() 
+1

你不能初始化這樣的字典!一個清單將是這種情況下的正確工具 – JBernardo 2011-12-19 23:29:11

+0

@JBernardo你是對的,對不起,我沒有想過兩次就寫了。列表在這種情況下是正確的。糾正。仍然從字典初始化錯誤中,我發現'adict = dict(1 = a)','adict = dict(one = a)'和'adict = {1:'a'}'之間的區別是做了一些錯誤的連接在我的大腦 – joaquin 2011-12-20 00:23:16

0

如果沒有布爾值,會出現警告嗎?

if not any(filter(lambda x: type(x)==bool, listvalues)): 
    print "warning" 
else: 
    filter(lambda x: type(x[1])==bool and x[1]==True, enumerate(listvalues)) 

對不起,忘了前5個元素的一部分,只是切它..並且不需要檢查布爾...

0
if your_list[:5] == [False,False,False,False,False]: 
    print 'warning' 
else: 
    method1(your_list[0]) 
    method2(your_list[1]) 
    method3(your_list[2]) 
    method4(your_list[3]) 
    method5(your_list[4]) 

def method1(myBool): 
    if myBool == False: 
     return 
    --- method content --- 

def method2(myBool): 
    if myBool == False: 
     return 
    --- method content --- 
... 

將是我的解決方案。

+0

我試過你的方法,但它說「放棄:本地變量'方法1'在賦值之前引用」 – user1106770 2011-12-20 09:29:40

相關問題