Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 消除重复-我应该使用一套吗?_Python - Fatal编程技术网

Python 消除重复-我应该使用一套吗?

Python 消除重复-我应该使用一套吗?,python,Python,我需要读取一个日志文件,提取所有路径,并返回一个不包含重复路径的排序列表。最好的方法是什么?使用集合 我想到了这样的事情: def geturls(filename) f = open(filename) s = set() # creates an empty set? for line in f: # see if the line matches some regex if match: s.add(match.group(1)) f.cl

我需要读取一个日志文件,提取所有路径,并返回一个不包含重复路径的排序列表。最好的方法是什么?使用
集合

我想到了这样的事情:

def geturls(filename)
  f = open(filename)
  s = set() # creates an empty set?

  for line in f:
    # see if the line matches some regex

    if match:
      s.add(match.group(1))

  f.close()

  return sorted(s)
编辑

放在集合中的项是路径字符串,函数应将其作为按字母顺序排序的列表返回

编辑2 以下是一些示例数据:

10.254.254.28--[06/Aug/2007:00:12:20-0700]“获取 /keyser/22300/HTTP/1.0“302 528”-” “Mozilla/5.0(X11;U;Linux i686 (x86_64);欧洲-美国;rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4“ 10.254.254.58--[06/Aug/2007:00:10:05-0700]“获取 /edu/languages/googlepython class/images/puzzle/a-baaa.jpg HTTP/1.0“200 2309” 谷歌机器人mscrawl moma(企业; 棒XYZ; foo123@google.com,foo123@google.com,foo123@google.com,foo123@google.com)" 10.254.254.28--[06/Aug/2007:00:11:08-0700]“获取 /favicon.ico HTTP/1.0“3023404” 谷歌机器人mscrawl moma(企业; 棒XYZ


有趣的部分是GET和HTTP之间的URL。也许我应该提到这是一个练习的一部分,并且只有在顺序不重要(因为集合是无序的)和类型是可散列的(哪些字符串是散列的)的情况下,才没有真实世界的数据,如果类型是可哈希的(哪些字符串是)。

您可以使用字典存储路径

from collections import defaultdict
h=defaultdict(str)
uniq=[]
for line in open("file"):
    if "pattern" in line:
       # code to extract path here.
       extractedpath= ......
       h[extractedpath.strip()] = "" #using dictionary to store unique values
       if extractedpath not in uniq:
           uniq.append(extractedpath) #using a list to store unique values

您可以使用字典来存储路径

from collections import defaultdict
h=defaultdict(str)
uniq=[]
for line in open("file"):
    if "pattern" in line:
       # code to extract path here.
       extractedpath= ......
       h[extractedpath.strip()] = "" #using dictionary to store unique values
       if extractedpath not in uniq:
           uniq.append(extractedpath) #using a list to store unique values

只有你到处都应该有完整的路径名,如果你在Windows中,名称可以是各种大小写,因为它们不区分大小写。在Python中,你也可以使用/而不是\(是:小心避开反斜杠)


如果您实际处理的是URL,则time domain.com、domain.com/、www.domain.com中的大多数都是相同的意思,您应该决定如何规范化。

只有到处都应该有完整的路径名,如果您在Windows中,名称可以是各种大小写,因为它们不区分大小写。在Python中,您也可以使用/而不是\(是的:小心避开反斜杠)

def sorted_paths(filename):
    with open(filename) as f:
       gen = (matches(line) for line in f)
       s = set(match.group(1) for match in gen if match)
    return sorted(s)


如果你实际上是在处理URL,那么time domain.com、domain.com/、www.domain.com中的大多数都是相同的意思,你应该决定如何规范化。

这是一种很好的方法,无论是在性能方面还是在简洁性方面。

这是一种很好的方法,无论是在性能方面还是在简洁性方面

@Silent,我想他是想把重点放在重复的问题上,而不是正则表达式上。@matthew:如果我们不知道他在集合中放了什么,我们怎么知道顺序是否重要呢?@Silent,他似乎已经考虑到了这一点,因为他使用的是
排序的
。实际文件名/路径列表的示例对于查看联合国非常有帮助格式的一致性。到底是什么产生了它?在典型的apache日志中,每行有一行request@Silent,我想他是想把重点放在重复的问题上,而不是正则表达式上。@matthew:如果我们不知道他在集合中放了什么,我们怎么知道顺序是否重要?@Silent,他似乎已经考虑到了这一点,因为他使用的是
 排序后的
。实际文件名/路径列表的示例对于查看格式的一致性非常有帮助。到底是什么产生了它?在典型的apache日志中,每个请求都有一行,这与问题有什么关系?集合需要精确的键、一个不同的大小写字母、额外的空间或/等等。并且您会得到重复的entries什么所有这些都与问题有关吗?集合需要精确的键、一个不同的大小写字母、额外的空格或/等。并且您会得到重复的条目。这里的字典有什么意义?一个与键无关的dict(设置为某个伪值且从不使用)本质上是一个穷人的语义错误、相对低效的集合。字典只是在迭代文件时存储唯一的路径值。我也可以使用列表..正如@deinan所说,将路径存储在
集合
而不是
dict
中会更有效,因为您不使用关联d值字典需要与每个键相关联(即您正在使用的
伪值)。无论使用哪种数据结构,每个字典键或集合元素都只能在容器中出现一次,因此无需维护单独的
uniq
列表--只需在处理文件中的所有行之后将所有字典键或集合元素提取到列表中。字典的意义何在re键不相关(设置为某个虚拟值且从不使用)本质上是一个穷人的语义错误、相对低效的集合。字典只是在迭代文件时存储唯一的路径值。我也可以使用列表..正如@deinan所说,将路径存储在
集合
而不是
dict
中会更有效,因为您不使用关联d值字典需要与每个键相关联(即您正在使用的
伪值)。无论使用哪种数据结构,每个字典键或集合元素只能在容器中出现一次,因此无需维护单独的
uniq
列表--只需在处理文件中的所有行后将所有字典键或集合元素提取到列表中即可。是的,使用集合删除重复项正变得越来越重要一种常见的Python习惯用法,只要项是可散列的。在将它们引入语言之前,通常使用具有伪值的词典。是的,使用集合删除重复项正在成为一种常见的Python习惯用法,只要项是可散列的。在将它们引入语言之前,我们使用具有伪值的词典如果匹配的组是整条线,我认为
def sorted_paths(filename):
    with open(filename) as f:
       gen = (matches(line) for line in f)
       s = set(match.group(1) for match in gen if match)
    return sorted(s)