0

我有以下类型的文件要通过 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)开头的行应该被视为相同的模式。

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

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

4

2 回答 2

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
于 2013-08-09T07:43:00.830 回答
0

我会考虑将每一行转换为一个列表,该列表在第一个条目中包含一个键,在第二个条目中包含一个辅助值列表。然后,您可以执行以下操作:

遍历行并对每行的值列表中的条目进行排序。

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

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

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

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

编辑:Thomas B. 的回答是一个很好的例子,说明了如何实现这种排序(并且比我的回答暗示的对实际数据结构进行洗牌更干净),但你必须以正确的顺序完成他的三种排序才能获得你正在寻找的结果,他的代码只实现了这三个中的一个。

于 2013-08-09T07:18:57.567 回答