如何按元素长度对列表列表进行分类?

时间:2019-02-26 05:54:34

标签: python arrays arraylist

我有一个列表列表,看起来像这样:

List=[[1,3],[3,4,7,9],[4,7],[2,4,5,3],[5,7,4]]

我想根据列表元素的长度对其进行分类,因此结果如下所示:

2ElelmentSublist=[[1,3],[4,7]]
4ElementSublist=[[3,4,7,9],[2,4,5,3]]
....

以此类推。

我读了一篇有关itertools.groupby()的帖子, 但是我不知道如何在我的情况下应用它。 有什么pythonic的方法吗?

注意:不需要将结果放在单独的变量中,我需要一种方法来知道我有多少种长度,并且需要一种方法来分别到达每个组。

谢谢。

5 个答案:

答案 0 :(得分:2)

您无法使用动态名称(在您的2ElementSublist左右)来创建具有动态名称的列表。

但是您可以设计一个字典,其中键作为长度,值作为列表列表。

尝试一下:

result = {}
for L in List:
    result.setdefault(len(L), list()).append(L)
print(result)

您将看到

{2: [[1, 3], [4, 7]], 4: [[3, 4, 7, 9], [2, 4, 5, 3]], 3: [[5, 7, 4]]}

.setdefault(k, d)允许您访问键k的字典值,或者使用默认值d进行初始化。然后附加每个列表。

答案 1 :(得分:1)

通过groupby使用len

例如:

from itertools import groupby

lst = [[1,3],[3,4,7,9],[4,7],[2,4,5,3],[5,7,4]]
print( [list(v) for k, v in groupby(sorted(lst, key=len), key=len)] )
#or
print( {k: list(v) for k, v in groupby(sorted(lst, key=len), key=len)} )

输出:

[[[1, 3], [4, 7]], [[5, 7, 4]], [[3, 4, 7, 9], [2, 4, 5, 3]]]
{2: [[1, 3], [4, 7]], 3: [[5, 7, 4]], 4: [[3, 4, 7, 9], [2, 4, 5, 3]]}

答案 2 :(得分:1)

可能不是最Python的,但您可以调用与所需方式类似的值。

POST

答案 3 :(得分:1)

由于您已经提到过,您需要按len分组的列表,并且需要将它们包含在单独的变量中,我认为您将需要dict作为最终输出。

from itertools import groupby, chain
from collections import defaultdict

List=[[1,3],[3,4,7,9],[4,7],[2,4,5,3],[5,7,4]]

res = defaultdict(list)
for _, v in groupby(sorted(List, key=len)):
    l = list(chain(*v))
    res[len(l)].append(l)

# Output : defaultdict(list,
            {2: [[1, 3], [4, 7]],
             3: [[5, 7, 4]],
             4: [[3, 4, 7, 9], [2, 4, 5, 3]]})

答案 4 :(得分:1)

您可以尝试以下方法:

byte [] null_arr = new byte[16];
// K: 2b7e1516 28aed2a6 abf71588 09cf4f3c
byte[] key = { 0x2b,0x7e,0x15,0x16,
0x28,0xae,0xd2,0xa6,
0xab,0xf7,0x15,0x88,
0x09,0xcf,0x4f,0x3c };

// M: 6bc1bee2 2e409f96 e93d7e11 7393172a Mlen: 128
byte[] message= { 0x6b,0xc1,0xbe,0xe2,
0x2e,0x40,0x9f,0x96,
0xe9,0x3d,0x7e,0x11,
0x73,0x93,0x17,0x2a };

byte [] cmac = new byte [16];

c = calc_AES_CMAC(message, key, cmac);
string ans = ByteArrayToString(cmac);
MessageBox.Show(ans);

List = [[1,3],[3,4,7,9],[4,7],[2,4,5,3],[5,7,4]] sizes = set([(len(element)) for element in List]) result = {} for element in List: if len(element) not in result.keys(): result[len(element)] = [] result[len(element)].append(element) print(result) 是:

result