通过列式模式在Python中对文件进行排序

时间:2013-08-09 06:00:35

标签: python sorting pattern-matching

我有以下类型的文件要通过Python处理:

key1 value1 value3 value5
key2 value2 value6
key3 value1 value5
key4 value4 value6 value5
key5 value4 value5 value6
key6 value3
....
keyN value5 value1

键都是唯一的,并且只有6个可能的值,但它们以任何顺序出现,并且可以存在与每个键关联的任何非零数字(1到6之间)。

有没有办法对这个文件进行排序,以便我们确定具有完全相同模式的值的行数,即有多少行具有模式“value1 value3 value5”?模式“value2 value6”等多少行? 在上面的例子中,以key4和key5(或key3和keyN)开头的行应该被计为相同的模式。

输出应该是以上述方式使用的同一文件。

我完全不知道如何做到这一点...任何帮助将不胜感激!谢谢。

2 个答案:

答案 0 :(得分:3)

构造一个聪明的键函数并使用普通函数进行排序。

def key_length_match(x):
    # only number of values is important
    xs = x.split()
    return len(xs)

def key_unorderd_match(x):
    # only the occurence of values is important
    xs = x.split()
    return (len(xs), set(xs[1:]))

def key_exact_match(x):
    # exact ordering of values is important
    xs = x.split()
    return (len(xs), xs[1:])

lines = (l.strip() for l in open('input.txt', 'r'))
lines = sorted(lines, key=key_unorderd_match, reverse=True)
for l in lines:
    print l

答案 1 :(得分:0)

我会考虑将每一行转换为一个列表,该列表包含第一个条目中的键和第二个条目中的二级值列表。然后,你可以这样做:

循环划线并对每行的值列表中的条目进行排序。

然后,按照键的串联和每行的所有值的排序顺序对行进行排序。

最后,为每个键创建一个值列表列表,并按照该列表长度的相反顺序对它们进行排序。

我毫不怀疑有很多可能的方法来获得这个结果,有些可能比我描述的更有效。您可以从Python中的排序讨论中找到一些灵感:

http://wiki.python.org/moin/HowTo/Sorting/

编辑:托马斯B.答案是一个很好的例子,说明如何实现这样的排序(而且比我的答案所暗示的更清洁而不是改变实际的数据结构)但是你必须按照正确的顺序进行他的三种排序获得你正在寻找的结果,他的代码只实现了三个中的一个。