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

标签 python list python-2.7

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

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

关于python - 如何比较 2 个列表,其中字符串与备用列表中的元素匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30020777/

相关文章:

python - 如何在 python 2.7 中循环遍历 if 语句中的选项列表?

python换行符为10个元素

python - 如果不是,如何使函数输入成为字符串?

python - 表格出现前的QtableView占位符文本

python - 使用python在ModbusRTU中同时调用多个寄存器?

python - Python 中无法解释的段错误

c# - 是否可以将 C# 双列表中的所有元素划分为该双列表元素总和(这使得总计 = 1)

python - 从预先存在的文件的大目录创建 Quilt 数据包时如何排除一种或多种文件类型

java - setVisibility 列表<item>

python - pandas timeseries DF 切片和选择