簡體   English   中英

檢查行是否以列表中的字符串開頭的首選方法?

[英]Preferred way to check if a line starts with a string from list?

我試圖逐行對文件進行排序,將開頭與列表中的字符串進行比較,如下所示:

for line in lines:
    skip_line = True
    for tag in tags:
        if line.startswith(tag) is False:
            continue
        else:
            skip_line = False
            break
    if skip_line is False:
        #do stuff

雖然代碼可以正常工作,但我想知道是否有一種更整潔的方法來檢查這種情況。 我已經看過any() ,但似乎只是讓我可以檢查我的任何行是否都以固定標簽開頭(而不是消除遍歷列表的for循環)。

所以,本質上我是在問:
是否有比使用for循環遍歷我的tags列表以檢查當前行是否以其元素之一開頭更好的,更時尚的選擇?

正如Paradox在他的回答中指出的那樣:使用字典查找字符串是否存在具有O(1)復雜性,實際上使整個代碼看起來更簡潔,同時比遍歷列表更快。 像這樣:

tags = {'ticker':0, 'orderBook':0, 'tradeHistory':0}
for line in lines:
    if line.split('\t')[0] in tags:
        #do stuff

如果您決定將其歸為一類,則可以使用生成器:

tagged_lines = (line for line in lines if any(line.startswith(tag) for tag in tags))
for line in tagged_lines:
    # Do something with line here 

當然,這是如何可讀的是另一個問題。

您之前可能已經看過[x*x for x in range(10)]語法[x*x for x in range(10)]語法,但是通過將[]換為() ,我們只在需要時才生成每個項目。

無需遍歷標簽列表,您可以將所有標簽放入HashMap中,並進行類似於myMap.exists(“ word”)的簡單查找。 這將比遍歷標簽列表要快得多,並且可以處理O(1)復雜性。 在python中,它實際上是一個字典數據結構。 http://progzoo.net/wiki/Python:Hash_Maps

這已經被問過了。 看看這篇文章,了解更多解決方案。 我會將此帖子標記為重復,但我仍然沒有聲譽。

https://stackoverflow.com/a/10477481/5016492

您需要修改正則表達式,使其看起來在行的開頭。 這樣的事情應該為您工作'^ tag'。

實際上, any()可以勝任

循環每行

for line in lines:
     tagged = any(lambda: line.startswith(y), tags)

任何列表以任何標簽開頭

any(lambda x: any(lambda y: x.startswith(y), tags), lines)

過濾標記的行

filter(lambda x: any(lambda y: x.startswith(y), tags), lines)

如何將any()和filter()結合起來,如本例所示:

# use your data here ...
mytags = ('hello', 'world')
mylines = ('hello friend', 'you are great', 'world is cruel')

result = filter(lambda line: any(map(lambda tag: line.startswith(tag), mytags)), mylines)
print result

暫無
暫無

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

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