Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.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_String_Performance_Comparison_String Comparison - Fatal编程技术网

Python:比较几千个字符串。有没有比较快的选择?

Python:比较几千个字符串。有没有比较快的选择?,python,string,performance,comparison,string-comparison,Python,String,Performance,Comparison,String Comparison,我有一组大约6000个数据包,出于比较目的,我将其表示为字符串(前28个字节),以与同样多的数据包进行比较,我也将其表示为28个字节的字符串 我必须把一套的每一包与另一套的每一包相匹配匹配始终是唯一的 我发现比较字符串需要一些时间。有没有办法加快这个过程 EDIT1:我不想排列字符串元素,因为我总是确保在数据包列表和相应的字符串列表之间保持顺序 EDIT2:这是我的实现: list1, list2 # list of packets (no duplicates present in each

我有一组大约6000个数据包,出于比较目的,我将其表示为字符串(前28个字节),以与同样多的数据包进行比较,我也将其表示为28个字节的字符串

我必须把一套的每一包与另一套的每一包相匹配匹配始终是唯一的

我发现比较字符串需要一些时间。有没有办法加快这个过程

EDIT1:我不想排列字符串元素,因为我总是确保在数据包列表和相应的字符串列表之间保持顺序

EDIT2:这是我的实现:

list1, list2 # list of packets (no duplicates present in each list!)
listOfStrings1, listOfStrings2 # corresponding list of strings. Ordering is preserved.
alreadyMatchedlist2Indices = []
for list1Index in xrange(len(listOfStrings1)):
            stringToMatch = listOfStrings1[list1Index]
            matchinglist2Indices = [i for i, list2Str in enumerate(listOfStrings2)
                                if list2Str == stringToMatch and i not in alreadyMatchedlist2Indices]
            if not matchinglist2Indices:
                tmpUnmatched.append(list1Index)
            elif len(matchinglist2Indices) == 1:
                tmpMatched.append([list1Index, matchinglist2Indices[0]])
                alreadyMatchedlist2Indices.append(matchinglist2Indices[0])
            else:
                list2Index = matchinglist2Indices[0] #taking first matching element anyway
                tmpMatched.append([list1Index, list2Index])
                alreadyMatchedlist2Indices.append(list2Index)
---在这里,我假设你一个接一个地拿每根弦,并与所有其他弦进行比较---


我建议对字符串列表进行排序并比较相邻字符串。这应该有一个O(nlogn)的运行时。

这里有一个简单的线性时间方法——至少如果我正确理解了你的问题:

>>> def get_matches(a, b):
...     reverse_map = {x:i for i, x in enumerate(b)}
...     return [(i, reverse_map[x]) for i, x in enumerate(a) if x in reverse_map]
... 
>>> get_matches(['a', 'b', 'c'], ['c', 'd', 'e'])
[(2, 0)]
它接受两个字符串序列,
a
b
,并将匹配列表返回到
a
b
中,以索引元组表示。这是O(n+m),其中m和n是
a
b
的长度

有什么问题吗:

matches = [packet for packet in list1 if packet in list2]

你需要知道字符串是否不同,或者说什么不同吗?不,不,我只需要知道哪两个元素完全相同。匹配我认为是唯一的。你应该包括你当前的实现,以便人们能够提供一个更快的替代方案。一个体面的哈希函数跨越28个八位字节应该很好。考虑使用标题字符串作为字典密钥,我添加了我正在使用的代码。如果排序是基于比较的,这不会爆炸运行时吗?抱歉,我并没有说我想保留两个列表的初始排序。我确保每个
I
listOfStrings[I]
对应于
listofspackets[I]
@Ricky Robinson:但也许你可以将
listOfStrings
listofspackets
一起排序。我的意思是,当你在一个列表中交换两个元素时,你在排序时在另一个列表中以同样的方式交换。通过这种方式,您可以确保
listofstring[i]
对应于
listofspackets[i]
。如果您希望复制内容,可以使用senderle建议的内容。请注意O(n)的空间复杂性,并且运行时取决于映射实现。@LewisDiamond,据我所知,所有Python字典实现都使用哈希映射。我用代码更新了我的原始帖子。您建议的代码片段是否明显更快?我希望它会快得多,因为
如果x in reverse\u map
是一个常量时间操作,那么在Python字典中测试一个键几乎不需要超过一到两个比较。因此,给定两个6000项列表,您的代码执行3600万个循环(6000*6000),而此函数仅执行12000个循环(6000+6000)。我使用
Scapy
,如果直接使用数据包结构,则需要花费很长时间。有“更轻”的选择吗?