我有一个从日志条目填充的列表;为了简单起见,像是
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的方式解决这个问题?我能想到的只是日志列表中的多次传递
答案 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']
说明: