在分隔符上拆分列表-将分隔符保留在组中

一波

我有一个奇怪的数据结构,该结构是我无法控制的外部服务返回给我的。

该数据本质上是一个字典列表,但在陌生的路上斩:它是返回字典的列表,其中每个字典有一个单一的关键。从该列表中获取多个元素将产生字典中的所有键。

在代码中:

[ {'id': 1}, {'a': a}, {'b': b}, {'c': c},
  {'id': 2}, {'a': a}, {'b': b}, {'c': c},
  {'id': 3}, {'a': a}, {'b': b}, {'c': c},
  ...
]

我要重建的每本字典都以id字典开头找到id密钥后,我需要从列表中获取所有值,直到找到另一个id

我当前的解决方案是:

def split_groups(data, key='id'):

    groups = []
    for e in data:
        if key in e:  # begin new group
            groups.append(list())
        groups[-1].append(e)

    return groups

可以,但是很丑。我知道itertools.groupby:但是,我真的不明白如何使用它。

这行的结果是:

[(k, list(g)) for k, g in groupby(data, lambda d: d.get('id') is not None)]

是:

[(True, [{'id': 1}]),
 (False, [{'a': 1}, {'b': 2}, {'c': 3}]),
 (True, [{'id': 2}]),
 (False, [{'a': 1}, {'b': 2}, {'c': 3}]),
 (True, [{'id': 3}]),
 (False, [{'a': 1}, {'b': 2}, {'c': 3}])]

如您所见,该id词典与以下值以不同的组结尾。

我究竟做错了什么?


在Sumukh Barve回答之后,我想groupby并不是我工作的正确工具。我当前的代码将用于生产;只是为了好玩,我这样重写它:

def split_groups(data, key='id'):

    if not data:
        return []

    predicate = lambda d: key not in d
    head, tail = data[0], data[1:]

    group = [[head] + list(takewhile(predicate, tail))]
    rest = list(dropwhile(predicate, tail))

    group.extend(split_groups(rest, key))
    return group

这是一种效率低下,可读性差,更具OCD吸引力的形式。

谢谢大家的帮助!


万一有一天有人偶然遇到我同样的问题,我将在完整的解决方案中附加一些示例数据。

苏穆克色彩

文档

itertools.groupby每当键函数的值改变时,它就会产生一个中断或新的组。

从这个意义上讲,itertools.groupby类似于str.split区别在于拆分序列也包含在输出中。

"1,2,3".split(",") ==> ["1", "2", "3"]
"1,2,3".splitLikeGroupBy(",") ==> ["1", ",", "2", ",", "3"]

因此,您没有做错任何事情。

另外,我想说您的解决方案很好。

但是,如果您坚持使用itertools.groupby,请尝试以下操作:

a = [(k, list(g)) for k, g in groupby(data, lambda d: d.get('id') is not None)];
[a[i][1] + a[i+1][1] for i in range(len(a)) if i % 2 == 0]

第一行直接来自您的代码。第二个是一些简单的处理。

建议:

您可能不希望使用单元素词典列表的列表,而要使用多元素词典列表的列表。

也就是说,与其一起使用:

[
    [{"id": "id1"}, {"a": "a1"}],
    [{"id": "id2"}, {"a": "a2"}], ...
]

您可能要使用此方法:

[
    {"id": "id1", "a": "a1"},
    {"id": "id2", "a": "a2"}, ...
]

希望这可以帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

根据子字符串分隔符拆分字符串,将分隔符保留在结果中

来自分类Dev

将分隔符保留在php中的preg_split中

来自分类Dev

像`column -t`这样的命令,而是将分隔符保留在输出中

来自分类Dev

是否可以将记录分隔符保留在awk中?

来自分类Dev

将UITableView填充保留在标头上,但不保留在IOS7上的分隔符中

来自分类Dev

我如何最好地使用componentsSeparatedByCharacterSet,但将分隔符/分隔符保留在第一个单词上?

来自分类Dev

用空格分隔符在R中拆分列

来自分类Dev

使用元素作为分隔符在python中拆分列表?

来自分类Dev

我可以使用分隔符在Haskell中拆分列表吗?

来自分类Dev

拆分列表,然后使用相同的分隔符将其重新加入

来自分类Dev

分割字符串并将分隔符字符串保留在C#中

来自分类Dev

用分隔符pandas python拆分列并仅保留新名称

来自分类Dev

在多个分隔符上拆分字符串,同时保留一个或多个分隔符

来自分类Dev

如何在R中不使用分隔符的情况下拆分列数据

来自分类Dev

根据多个可能的分隔符拆分字符串,但保留分隔符

来自分类Dev

使用分隔符进行正则表达式拆分,同时保留分隔符

来自分类Dev

在多个(多个)分隔符上拆分 List<string>

来自分类Dev

遍历join()中的分隔符列表

来自分类Dev

AngularJs中列表分隔符的降序

来自分类Dev

列表中的离子字母分隔符

来自分类Dev

基于 1 个或多个可能的分隔符的 SQL 拆分列并插入新表

来自分类Dev

Ruby拆分字符串并保留分隔符

来自分类Dev

如何在分隔符上分割字符串,并将分隔符保留为结果数组中的元素?

来自分类Dev

如何在分隔符上分割字符串,并将分隔符保留为结果数组中的元素?

来自分类Dev

如何在Unix中基于分隔符将文件拆分为多个文件,并同时删除分隔符

来自分类Dev

根据分隔符拆分多个条目

来自分类Dev

在C#中使用分隔符而不是按索引将列表拆分为子列表

来自分类Dev

Python使用分隔符将列表拆分成几个列表

来自分类Dev

将整数列表拆分为给定 0 作为分隔符的子列表

Related 相关文章

  1. 1

    根据子字符串分隔符拆分字符串,将分隔符保留在结果中

  2. 2

    将分隔符保留在php中的preg_split中

  3. 3

    像`column -t`这样的命令,而是将分隔符保留在输出中

  4. 4

    是否可以将记录分隔符保留在awk中?

  5. 5

    将UITableView填充保留在标头上,但不保留在IOS7上的分隔符中

  6. 6

    我如何最好地使用componentsSeparatedByCharacterSet,但将分隔符/分隔符保留在第一个单词上?

  7. 7

    用空格分隔符在R中拆分列

  8. 8

    使用元素作为分隔符在python中拆分列表?

  9. 9

    我可以使用分隔符在Haskell中拆分列表吗?

  10. 10

    拆分列表,然后使用相同的分隔符将其重新加入

  11. 11

    分割字符串并将分隔符字符串保留在C#中

  12. 12

    用分隔符pandas python拆分列并仅保留新名称

  13. 13

    在多个分隔符上拆分字符串,同时保留一个或多个分隔符

  14. 14

    如何在R中不使用分隔符的情况下拆分列数据

  15. 15

    根据多个可能的分隔符拆分字符串,但保留分隔符

  16. 16

    使用分隔符进行正则表达式拆分,同时保留分隔符

  17. 17

    在多个(多个)分隔符上拆分 List<string>

  18. 18

    遍历join()中的分隔符列表

  19. 19

    AngularJs中列表分隔符的降序

  20. 20

    列表中的离子字母分隔符

  21. 21

    基于 1 个或多个可能的分隔符的 SQL 拆分列并插入新表

  22. 22

    Ruby拆分字符串并保留分隔符

  23. 23

    如何在分隔符上分割字符串,并将分隔符保留为结果数组中的元素?

  24. 24

    如何在分隔符上分割字符串,并将分隔符保留为结果数组中的元素?

  25. 25

    如何在Unix中基于分隔符将文件拆分为多个文件,并同时删除分隔符

  26. 26

    根据分隔符拆分多个条目

  27. 27

    在C#中使用分隔符而不是按索引将列表拆分为子列表

  28. 28

    Python使用分隔符将列表拆分成几个列表

  29. 29

    将整数列表拆分为给定 0 作为分隔符的子列表

热门标签

归档