簡體   English   中英

如何匹配列表的一部分並在python中返回其他部分

[英]How to match part of a list and return other parts in python

我們存儲了線

['frontend2', 'ac1b360e-daa8-4102-bc7e-aae01ac5f6ab', 'POST', '2016-10-28T09:29:07.940000'],

在稱為數據的數組中。 我們知道它在里面是因為:

>>> print data
[['frontend2', 'ac1b360e-daa8-4102-bc7e-aae01ac5f6ab', 'POST', '2016-10-28T09:29:07.940000'], ['worker42', 'ac1b360e-daa8-4102-bc7e-aae01ac5f6ab', 'HANDLE', '2016-10-28T09:29:07.970000'], ['frontend7', '2ef630e2-64fb-4100-8a04-07c4d25887b7', 'GET', '2016-10-28T09:29:07.970000'], ['frontend9', 'a9af2495-f2f0-42e3-81fa-d99d4bac5b9c', 'GET', '2016-10-28T09:29:07.990000'], ['frontend19', '0336af66-edff-48e0-958c-42d09d0efd7a', 'GET', '2016-10-28T09:29:08.010000'], ['frontend14', 'ebc80de2-3708-4aa5-88e4-d3c08a018961', 'GET', '2016-10-28T09:29:08.030000'], ['frontend16', '14fd9242-7a0c-4f42-ab0c-f8e6de21f948', 'GET', '2016-10-28T09:29:08.040000'], ['frontend2', 'ac1b360e-daa8-4102-bc7e-aae01ac5f6ab', 'RESPOND', '2016-10-28T09:29:08.050000'], ['frontend5', '8b3e6d9f-abbc-46c0-a458-05e6fd3bbe6c', 'POST', '2016-10-28T09:29:08.060000'], ['frontend3', 'd8389212-c91e-450b-8745-2cb121cb9623', 'POST', '2016-10-28T09:29:08.090000']]

甚至可以拉出整條線:

>>> print data[0]
['frontend2', 'ac1b360e-daa8-4102-bc7e-aae01ac5f6ab', 'POST', '2016-10-28T09:29:07.940000']

可以拉出線的任何部分:

>>> print data[0][0]
frontend2

問題:我需要找到一個以frontend2開頭並包含RESPOND的行,並拉出其他部分。

有人可能認為索引至少可以找到它,但是沒有:

>>> data.index("frontend2")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 'frontend2' is not in list
>>>

什么是pythonic方式做到這一點?
理想情況下,我可以使用data [frontend2] [2]之類的東西,它將掃描列表,找到匹配的第一行,並返回2索引項。 (或者,對於腳本的另一部分,覆蓋2項而不觸碰其余部分。)

過濾器將使我得到所有行; 想必我可以進一步過濾以僅獲取獲取行? 我還沒有找到好的文檔。 任何解釋表示贊賞。 在列表理解模式下執行此操作會產生相同的結果。

>>> print filter(lambda x: 'frontend2' in x, data)
[['frontend2', 'ac1b360e-daa8-4102-bc7e-aae01ac5f6ab', 'POST', '2016-10-28T09:29:07.940000'], ['frontend2', 'ac1b360e-daa8-4102-bc7e-aae01ac5f6ab', 'RESPOND', '2016-10-28T09:29:08.050000']]

一種可能的解決方案可能是使用正則表達式並對此進行過濾,但絕對似乎應該有一種更好的方法。

要使用列表推導 ,您必須在過濾器中應用與所需子列表匹配的所有條件:

>>> [lst for lst in data if  lst[0]=='frontend2' and 'RESPOND' in lst]
[['frontend2', 'ac1b360e-daa8-4102-bc7e-aae01ac5f6ab', 'RESPOND', '2016-10-28T09:29:08.050000']]

選擇一:顯而易見

一種非常明顯的方式,它可以掃描列表中的每個元素並查找所需的兩個標記:

for line in data:
   if 'frontend2' in line and 'RESPOND' in line:
       print line

替代方案2:效率更高

如果您知道該行必須以frontend2 開頭 ,則可以使用更有效的方法:

for line in data:
    if line[0] == 'frontend2' and 'RESPOND' in line:
        print line

備選方案3:使用過濾器

使用過濾器和您需要的所有條件的另一種選擇:

print filter(lambda x: 'frontend2' in x and 'RESPOND' in x, data)
>>> [['frontend2', 'ac1b360e-daa8-4102-bc7e-aae01ac5f6ab', 'RESPOND', '2016-10-28T09:29:08.050000']]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM