解析列表,检查它是否包含其他列表中的元素并打印出这些元素

时间:2017-04-18 07:47:05

标签: python list

我有一个从日志条目填充的列表;为了简单起见,像是

listlog = ["entry1:abcde", "entry2:abbds", "entry1:eorieo", "entry3:orieqor", "entry2:iroewiow"......]

此列表可以有一个未定义的entry个数,由于我以异步方式运行多个操作,因此可能顺序也可能不顺序。

然后我有另一个列表,我用作参考只获取条目列表;这可能就像

list_template = ["entry1", "entry2", "entry3"]

我正在尝试使用第二个列表来获取条目序列,因此我可以隔离单个序列,只获取每个条目的第一个实例。

由于我不处理数字,我不能使用set,所以我尝试在循环中使用循环,比较每个列表中的值

这不起作用,因为有可能在我正在寻找之前发生另一个条目(比方说,我想要entry1,entry2,entry3,并且循环找到entry1,但是然后找到entry3,因为我比较每个每个列表的元素,它将很乐意找到一个元素)

for item in listlog:
    entry, value = item.split(":")
    for reference_entry in list_template:
        if entry == reference_entry:
            print item
            break

简而言之,我必须在模板列表中找到序列,而这些项目不一定按顺序排列。我试图解析列表一次,否则我可以为模板列表的每个元素做一个非常昂贵的多次传递,直到我找到第一次出现并挽救。我认为在循环中执行循环更有效,因为我的引用列表总是小于日志列表,这通常是很少的元素。

您将如何以最有效和最pythonic的方式解决这个问题?我能想到的只是日志列表中的多次传递

3 个答案:

答案 0 :(得分:0)

您可以使用dict

>>> listlog
['entry1:abcde', 'entry2:abbds', 'entry1:eorieo', 'entry3:orieqor', 'entry2:iroewiow']
>>> list_template
['entry1', 'entry2', 'entry3']
>>> for x in listlog:
...     key, value = x.split(":")
...     if key not in my_dict and key in list_template:
...         my_dict[key] = value
... 
>>> my_dict
{'entry2': 'abbds', 'entry3': 'orieqor', 'entry1': 'abcde'}

答案 1 :(得分:0)

您可以使用list comprehension这样的内容:

import re

listlog = ["entry1:abcde", "entry2:abbds", "entry1:eorieo", "entry3:orieqor", "entry2:iroewiow"]

print([item for item in listlog if re.search('entry', item)])
# ['entry1:abcde', 'entry2:abbds', 'entry1:eorieo', 'entry3:orieqor', 'entry2:iroewiow']

你可以根据自己的意愿分割它们,如果你愿意,可以创建一个dictonary:

import re

listlog = ["entry1:abcde", "entry2:abbds", "entry1:eorieo", "entry3:orieqor", "entry2:iroewiow"]

mylist = [item for item in listlog if re.search('entry', item)]

def create_dict(string, dict_splitter=':'):
    _dict = {}

    temp = string.split(dict_splitter)
    key = temp[0]
    value = temp[1]
    _dict[key] = value

    return _dict


mydictionary = {}

for x in mylist:
    x = str(x)
    mydictionary.update(create_dict(x))


for k, v in mydictionary.items():
    print(k, v)
    # entry1 eorieo
    # entry2 iroewiow
    # entry3 orieqor

如您所见,此方法需要更新,因为我们已更改字典值。那很糟。最好更新同一个键的值。但是你可以想象的更容易

答案 2 :(得分:0)

免责声明:此答案可能会使用某人对绩效的洞察力。当然,list / dict comprehensions和zip是 pythonic ,但以下几乎可能是对这些工具的不当使用。

您可以使用zip

>>> data = ["a:12", "b:32", "c:54"]
>>> ref = ['c', 'b']
>>> matches = zip(ref, [val for key,val in [item.split(':') for item in data] if key in ref])
>>> for k, v in matches:
>>>     print("{}:{}".format(k, v))
c:32
b:54 

这是另一种(更糟糕的是,我不确定,性能方面)解决这个问题的方法:

>>> data = ["a:12", "b:32", "c:54"]
>>> data_dict = {x:y for x,y in [item.split(':') for item in data]}
>>> ["{}:{}".format(key, val) for key,val in md.items() if key in ref]
['b:32', 'c:54'] 

说明:

  1. 使用dict
  2. 将初始列表转换为dict
  3. 对于在dict中找到的每对(key,val),如果在'ref'列表中找到该键,则将它们连接成一个字符串