按列模式对Python中的文件进行排序

按列模式对Python中的文件进行排序,python,sorting,pattern-matching,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之间)与每个键关联 是否有任何方法可以对该文件进行排序,以确定

我需要通过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)开头的行应计为相同的模式

输出应与以上述方式调用的文件相同


我完全不知道该怎么做…任何帮助都将不胜感激!谢谢。

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

在各行上循环并对各行值列表中的条目进行排序

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

最后,为每个键创建一个值列表,并按列表长度的相反顺序对其排序

我毫不怀疑,有许多可能的方法可以得到这个结果,有些可能比我描述的更有效。关于Python排序的讨论可能会给您带来一些启示:


编辑:Thomas B.的答案是如何实现此类排序的一个很好的例子(比我的答案所暗示的搅乱实际数据结构更干净),但是您必须按照正确的顺序执行他的三种排序,才能得到您想要的结果,他的代码只实现了三个.< /p> ,我会考虑将每一行转换为包含第一个条目中的键和第二个值中的第二个列表的列表。然后,您可以这样做:

在各行上循环并对各行值列表中的条目进行排序

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

最后,为每个键创建一个值列表,并按列表长度的相反顺序对其排序

我毫不怀疑,有许多可能的方法可以得到这个结果,有些可能比我描述的更有效。关于Python排序的讨论可能会给您带来一些启示:


编辑:Thomas B.的答案是如何实现此类排序的一个很好的例子(比我的答案所暗示的搅乱实际数据结构更干净),但是您必须按照正确的顺序执行他的三种排序,才能得到您想要的结果,他的代码只实现了三个函数中的一个。

构造一个巧妙的键函数,并使用普通函数进行排序

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

构造一个巧妙的键函数并使用普通函数进行排序

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

给定输入文件的预期输出是什么?@falsetru它应该是我描述的同一个文件,即值遵循从值1到值6的预期模式(顺便说一句,值不是数字,而是已知字符串)。列最多的行应该位于排序文件的顶部,而key:single-value对应该位于最底部。谢谢给定输入文件的预期输出是什么?@falsetru它应该是我描述的同一个文件,即值遵循从值1到值6的预期模式(顺便说一句,值不是数字,而是已知字符串)。列最多的行应该位于排序文件的顶部,而key:single-value对应该位于最底部。谢谢这是一个聪明的按键功能!我会再多考虑一下,但我能马上感觉到这是正确的方法。谢谢这是一个聪明的按键功能!我会再多考虑一下,但我能马上感觉到这是正确的方法。谢谢