2013-04-30 47 views
0

我有這樣的結構:檢查,如果項目是在列表中,然後返回該項目

['a;1,2,3\n', 'b;abc\n', ...] 
換句話說

:這是一個List像這樣的項目:'id;element1,element2,...\n'

現在我想檢查列表包含了ID = "b"一個元素,如果它cotains項目"b"我想回到整個元素:

'b;abc\n' 

如何用python做到這一點?是否有可能通過in聲明來做到這一點?

+2

最近有這麼多的列表理解問題。連續四次。這對其他人來說看起來很奇怪嗎? – TerryA 2013-04-30 08:56:27

+0

列表理解問題的級別太高了。 – 2013-04-30 08:57:27

+0

我發誓我以前見過這個問題,但也許我想象的還要 – jamylak 2013-04-30 08:58:54

回答

2

這將返回符合條件的所有物品的清單,我認爲它可能有不止一個相匹配的結果,如果只有1條結果,結果列表將有1項。

>>> input = ['a;1,2,3\n', 'b;abc\n'] 
>>> filter(lambda item:item.find('b;') == 0 ,input) 
['b;abc\n'] 
+0

這將檢查整個列表,即使它找到的項目 – jamylak 2013-04-30 09:10:30

+0

@jamylak我同意,但我所做的假設,而不是發現第一次發生,OP可能正在尋找一件物品的所有事件。 – DhruvPathak 2013-04-30 09:11:57

+0

啊,那也可以 – jamylak 2013-04-30 09:20:31

2
>>> L = ['a;1,2,3\n', 'b;abc\n'] 
>>> next((x for x in L if x.partition(';')[0] == 'b'), 'No match') 
'b;abc\n' 
1

您可以使用下面的函數來提取您的結構匹配的所有元素的列表:

def query(data, key): 
    return [ x for x in data if x.startswith(key + ';') ] 

使用例:

data = [ 
    'a;1,2,3\n', 
    'b;abc\n', 
    'c;4,5,6\n' 
] 
print query(data, 'b') 

這給列表。如果你要求一個不存在的密鑰,結果是空的列表。

0

其他方法最有可能更快。

>>> L = ['a;1,2,3\n', 'b;abc\n'] 
>>> temp = [i.split(';') for i in L] 
>>> ';'.join([x for x in temp if x[0] == 'b'][0]) 
'b;abc\n' 
相關問題