Skip to main content
 首页 » 编程设计

python之如何比较 2 个列表,其中字符串与备用列表中的元素匹配

2025年05月04日21shihaiming

您好,我正在学习,所以您可能需要耐心等待。我有 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,谢谢

请您参考如下方法:

你只有两个条件,要么在字符串中,要么计数等于 Entry 的长度,两者都没有捕捉到第一个元素 'Week_Stop',长度从 7- 6-5 catch 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方法是相似的:

def EntryToFieldMatch(Entry, Fields): 
    valid = [] 
    st = set(Fields) 
    for word in Entry: 
        spl = word.split(None,1) 
        if spl[0] in st: 
            valid.append(word) 
            st.remove(spl[0]) 
    print valid 
    print "-"*50 
    print st 

使用集合的区别在于不维护顺序。