2015-05-03 38 views
2

嗨,我正在學習過程中,所以您可能不得不忍受我。我有兩個我想比較的列表,同時保留任何匹配並追加它們,同時將任何非匹配追加到另一個輸出列表。 繼承人我的代碼:如何比較兩個列表,其中字符串與備用列表中的元素匹配

def EntryToFieldMatch(Entry, Fields): 
    valid = [] 
    invalid = [] 
    for c in Entry: 
     count = 0 
     for s in Fields: 
      count +=1 
      if s in c: 
       valid.append(c) 
      elif count == len(Entry): 
       invalid.append(s) 
       Fields.remove(s) 



    print valid 
    print "-"*50 
    print invalid 


def main(): 
    vEntry = ['27/04/2014', 'Hours = 28', 'Site = Abroad', '03/05/2015', 'Date = 28-04-2015', 'Travel = 2'] 
    Fields = ['Week_Stop', 'Date', 'Site', 'Hours', 'Travel', 'Week_Start', 'Letters'] 
    EntryToFieldMatch(vEntry, Fields) 

if __name__ = "__main__": 
    main() 

輸出似乎除了它不返回在2輸出列出所有字段的罰款。這是我收到的輸出:

['Hours = 28', 'Site = Abroad', 'Date = 28-04-2015', 'Travel = 2'] 
-------------------------------------------------- 
['Week_Start', 'Letters'] 

我只是不知道爲什麼第二個列表不包括「Week_Stop」。我已經運行了調試器並通過了幾次代碼,但無濟於事。我已經閱讀過有關集合,但我沒有看到任何方式來返回匹配的字段,並放棄不匹配的字段。 此外,即時通訊開放的建議,如果有人知道的方式來簡化這一整個過程,我不是要求免費的代碼,只是在正確的方向點頭。 Python 2.7,謝謝

+0

這是一個有點不清楚的輸出應該是什麼。 1)有效的條目2)無效的條目或錯過的領域? – tmthydvnprt

+0

'count == len(Entry)'對我來說毫無意義。應該是'count == len(Fields)'也許吧? –

+0

現在看看它,它應該以下面所示的一種方式完成,當時我的想法是,如果有更多的條目,那麼當所有的字段被整理出來時,有些條目會被取消選中。這可能是特定於我的情況,但Entry將總是有更多的元素,然後字段。 – SidSpace

回答

0

你只有兩個條件,要麼是在字符串中,要麼是count等於Entry的長度,它們都不能捕獲第一個元素'Week_Stop',長度從7-6-5捕獲Week_Start,但從來沒有達到0,所以你永遠不會達到Week_Stop

更有效的方式是使用套或collections.OrderedDict如果你想維持秩序:

from collections import OrderedDict 
def EntryToFieldMatch(Entry, Fields): 
    valid = [] 
    # create orderedDict from the words in Fields 
    # dict lookups are 0(1) 
    st = OrderedDict.fromkeys(Fields) 
    # iterate over Entry 
    for word in Entry: 
     # split the words once on whitespace 
     spl = word.split(None, 1) 
     # if the first word/word appears in our dict keys 
     if spl[0] in st: 
      # add to valid list 
      valid.append(word) 
      # remove the key 
      del st[spl[0]] 
    print valid 
    print "-"*50 
    # only invalid words will be left 
    print st.keys() 

輸出:

['Hours = 28', 'Site = Abroad', 'Date = 28-04-2015', 'Travel = 2'] 
-------------------------------------------------- 
['Week_Stop', 'Week_Start', 'Letters']  

對於大名單,這將是比你的二次顯著快做法。有0(1)字典查找意味着您的代碼從二次到線性,每次你做in Fields這是一個0(n)操作。

使用set的方法是相似的:

的區別使用設置是爲了不保持。

+0

那麼你的第二個解決方案會比mpolednik的解決方案更快嗎?順序不是一個關鍵因素。 – SidSpace

+0

@SidSpace,對於任何合理的輸入大小集合來說效率要高得多,線性總是會比二次方更好。只有額外的成本才能實現循環Entry是構建一個線性操作的集合/字典 –

+0

鑑於這看起來像是一個更加可計算的解決方案,我將把它作爲正確的答案。同樣抱歉,投票不知道爲什麼會發生這種情況 – SidSpace

-1

使用list comprehension

def EntryToFieldMatch(Entries, Fields): 

    # using list comprehension 
    # (typically they go on one line, but they can be multiline 
    # so they look more like their for loop equivalents) 
    valid = [entry for entry in Entries 
       if any([field in entry 
         for field in Fields])] 

    invalidEntries = [entry for entry in Entries 
          if not any([field in entry 
             for field in Fields])] 

    missedFields = [field for field in Fields 
          if not any([field in entry 
             for entry in Entries])] 

    print 'valid entries:', valid 
    print '-' * 80 
    print 'invalid entries:', invalidEntries 
    print '-' * 80 
    print 'missed fields:', missedFields 

vEntry = ['27/04/2014', 'Hours = 28', 'Site = Abroad', '03/05/2015', 'Date = 28-04-2015', 'Travel = 2'] 
Fields = ['Week_Stop', 'Date', 'Site', 'Hours', 'Travel', 'Week_Start', 'Letters'] 
EntryToFieldMatch(vEntry, Fields) 

valid entries: ['Hours = 28', 'Site = Abroad', 'Date = 28-04-2015', 'Travel = 2'] 
-------------------------------------------------------------------------------- 
invalid entries: ['27/04/2014', '03/05/2015'] 
-------------------------------------------------------------------------------- 
missed fields: ['Week_Stop', 'Week_Start', 'Letters'] 
+0

我認爲你可能誤讀了帖子,預期的結果應該是相同的對於您的有效列表,但在無效列表中,只應該有與「條目」中的任何內容不匹配的字段。例如「Week_Stop」,「Week_Start」和「Letters」。我確實喜歡這個方法。對於低調投票我也不知道爲什麼會發生這種情況 – SidSpace

+0

謝謝!我認爲這個問題還不清楚,我添加了一條評論來澄清和編輯我的答案,包括兩個...... – tmthydvnprt

相關問題