如何查找和分组4位数的相似排列

时间:2016-09-10 16:24:40

标签: python permutation

我不擅长这些,但请耐心等待。我的数据库/列表中有一组数字,都是4位数字,数字介于和之间,包括0000到9999。

说清单是:

[1234, 4354, 6554, 2134, 3214, 5456, 9911, 1199]

基本上,我想以这种方式对它们进行分组

1234, 2134, 3214 is group A
6554, 5456 is group B
9911, 1199 is group C
4354 is group D

其中每个组中的列表项都包含相同的数字 - 即,组A都由数字1,2,3和4组成。然后我将找到len(组A),len(组) B),len(C组),len(D组)...... 然后以递减的方式对它们进行排序。

怎么做? 如果列表很大,那么该方法仍然可以正常工作吗?

2 个答案:

答案 0 :(得分:0)

这是一个(在Python 2.7.10中测试过)解决方案:

def index(number):
    digits = list(str(number))
    return ''.join(sorted(digits))

groups = {}
numbers = [1234, 4354, 6554, 2134, 3214, 5456, 9911, 1199]

for number in numbers:
    key = index(number)

    if key not in groups:
        groups[key] = []

    groups[key].append(number)

print groups.values() # [[1234, 2134, 3214], [4354], [6554, 5456], [9911, 1199]]

此解决方案的关键是获取每个数字的数字并对其进行排序,然后将该结果用作字典键。 index()只是生成每个数字的数字排序形式的简洁方法。

答案 1 :(得分:0)

不确定您要对命名组做什么,但在将整数转换为字符串并对这些字符进行排序后可以使用itertools.groupby

from itertools import groupby

l = [1234, 4354, 6554, 2134, 3214, 5456, 9911, 1199]

# ints to (int, sorted str)
s = map(lambda x: (x, ''.join(sorted(str(x)))), l)

# sort the list for groupby
s.sort(key=lambda kv: kv[1])

# print out just the ints of the groups
for _, g in groupby(s, lambda kv: kv[1]):
    print map(lambda kv: kv[0], g)

输出

[9911, 1199]
[1234, 2134, 3214]
[4354]
[6554, 5456]