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