在Python2.7中对列表中的元素进行分组

在Python2.7中对列表中的元素进行分组,python,arrays,list,python-2.7,count,Python,Arrays,List,Python 2.7,Count,好的,我收到一条很长的短信。我用正则表达式提取匹配项(此处省略,因为这无关紧要,我不擅长于此,所以你不会看到我的正则表达式有多难看:)并计算它们。然后,为了可读性,我将元素拆分并以我需要的方式打印: import re f = re.findall(r"(...)", PF) a = [[y,f.count(y)] for y in set(f)] (' '.join(map(str, j)) for j in w) for element in w: print element 结果

好的,我收到一条很长的短信。我用正则表达式提取匹配项(此处省略,因为这无关紧要,我不擅长于此,所以你不会看到我的正则表达式有多难看:)并计算它们。然后,为了可读性,我将元素拆分并以我需要的方式打印:

import re
f = re.findall(r"(...)", PF)
a = [[y,f.count(y)] for y in set(f)]
(' '.join(map(str, j)) for j in w)
for element in w:
    print element
结果是

['202', 1]
['213', 2]
['210', 2]
['211', 2]
['208', 2]
['304', 1]
['107', 2]
['133', 1]
['132', 1]
['131', 2]
我需要的是将元素分组,以便得到如下输出

A ['133', 1]
  ['132', 1]
  ['131', 2]
B ['202', 1]
  ['213', 2]
C ['304', 1]
  ['107', 2]
  ['210', 2]
  ['211', 2]
  ['208', 2]
请注意:

  • 在最终结果中,我需要5组(A、B、C、D、E)
  • 元素可以不同,例如明天131可能不存在,但我可能有232个元素在A组中,元素的数量每天都不同
  • 如果将每组中的元素按数字排序,这将是完美的,但不是强制性的
  • 可能听起来很明显,但无论如何我都会说清楚,我确切地知道哪些元素需要加入到哪个组中。如果有任何帮助,A组可以包含(102103)、B组(104105106201202203)、C组(204205206301302303304)、D组(107108109110208209210211213305306307)、E组(13113213323232)
脚本需要获取当天显示的结果,将它们与上面的列表进行比较,并将其排序到相关组中


提前谢谢

您可以设置将元素映射到组的哈希。然后可以将每个数组项从[element,count]转换为(group,element,count)(使用元组使其更易于排序等)。对该数组排序,然后使用循环或
reduce
将其转换为最终输出

mapElementsToGroups = {'131': 'A', '202': 'B', '304': 'C', …}

elementsFoundByGroup = {}
for (group, element, count) in sorted(
            [(mapElementsToGroups[item[0]], item[1], item[2])
                for item in a]
        ):
    elementsFoundByGroup[group] = elementsFoundByGroup.get(group, []) + [(element, count)]
现在,您有了一个字典,将找到的每个组名映射到该组中的元素和计数列表。快速打印是:

print [
            group + " " +
            elements.join("\n " + " "*len(group))
                for (group,elements) in sorted(elementsFoundByGroup.items())
        ].join("\n")

可以设置将元素映射到组的哈希。然后可以将每个数组项从[element,count]转换为(group,element,count)(使用元组使其更易于排序等)。对该数组排序,然后使用循环或
reduce
将其转换为最终输出

mapElementsToGroups = {'131': 'A', '202': 'B', '304': 'C', …}

elementsFoundByGroup = {}
for (group, element, count) in sorted(
            [(mapElementsToGroups[item[0]], item[1], item[2])
                for item in a]
        ):
    elementsFoundByGroup[group] = elementsFoundByGroup.get(group, []) + [(element, count)]
现在,您有了一个字典,将找到的每个组名映射到该组中的元素和计数列表。快速打印是:

print [
            group + " " +
            elements.join("\n " + " "*len(group))
                for (group,elements) in sorted(elementsFoundByGroup.items())
        ].join("\n")
一种(可能不是最优雅的)解决方案是使用映射定义字典,然后查找元素所属组的名称

elements = { "133": "A", "132": "A", 
             "202": "B", 
              ... }
然后,可以将这些元素添加到以组名为键的新词典中:

groups = {"A":[], "B": [], ...}
for element, count in a:
    group = elements[element]
    groups[group].append( (element, count) )

for group in groups:
    groups[group].sort()                   # sort by element
    for element, count in groups[group]:
        print "%s %s %s" % (group, element, count)
一种(可能不是最优雅的)解决方案是使用映射定义字典,然后查找元素所属组的名称

elements = { "133": "A", "132": "A", 
             "202": "B", 
              ... }
然后,可以将这些元素添加到以组名为键的新词典中:

groups = {"A":[], "B": [], ...}
for element, count in a:
    group = elements[element]
    groups[group].append( (element, count) )

for group in groups:
    groups[group].sort()                   # sort by element
    for element, count in groups[group]:
        print "%s %s %s" % (group, element, count)

看起来很像这样:有什么东西可以编辑吗?还是我误解了?就我的理解,如果A,B。。。不在列表中,分组是由什么完成的?我正在查看itertools groupby,这可能会奏效,谢谢。如果我想不出来,我会再次发表评论:D为清晰起见编辑OP。谢谢!无论如何,
groupby()
是我认为应该使用的工具。j在w中的
('''.join(map(str,j))应该做什么?您只需创建一个生成器并立即丢弃它。看起来非常像这样:从那里可以编辑任何东西吗?还是我误解了?就我的理解,如果A,B。。。不在列表中,分组是由什么完成的?我正在查看itertools groupby,这可能会奏效,谢谢。如果我想不出来,我会再次发表评论:D为清晰起见编辑OP。谢谢!无论如何,
groupby()
是我认为应该使用的工具。j在w中的
('''.join(map(str,j))应该做什么?您只需创建一个生成器并立即丢弃它。