Python:比较几千个字符串。任何比较快速的替代方案?

时间:2013-04-17 19:36:29

标签: python string performance comparison string-comparison

我有一组 6 000个数据包,为了进行比较,我将其表示为字符串(前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)

3 个答案:

答案 0 :(得分:5)

---在这里,我假设你逐个接受每一个字符串并与其他字符串进行比较.---

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

答案 1 :(得分:4)

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

>>> 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)]

这接受两个字符串序列ab,并将表示为索引元组的匹配列表返回到ab。这是O(n + m),其中m和n是ab的长度。

答案 2 :(得分:0)

出了什么问题:

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