如何对记录进行分组,排序,计数和输出结果

时间:2013-02-28 01:32:00

标签: sorting python-2.7 group-by

我正在尝试创建一个执行以下操作的python脚本:

表(dbf或csv-I可以创建)将始终只有4条记录。第二列(Let)将始终按顺序排列a,b,c,d。第1列(Num)的数字始终在0-10之间,但频率和顺序会有所不同。输出需要按Num排序和分组,最先输出的数字最小。如果第一列中的数字显示一次,则只输出相应的字母。如果数字出现两次(即两行具有相同的数字),则每个对应的字母在它们之间输出“和”。如果数字显示超过两次,则每个字母之间用逗号输出,并在最后一个字母前输入“和”。显示的每个字母组都有自己的输出线。

基本上希望对4个选项中的1个进行排序,分组和输出:

“无数据”
单独1个字母
2个字母用“和”分隔 3个字母用逗号分隔,“and”用最后一个字母分隔。

下面是一个名为soils_no.dbf的表的各种版本及其所需的输出,具体取决于输入。

货号..........让
0 ...............一个
0 ............... b
0 ...............Ç
0 ............... d
打印“无数据”

货号..........让
8 ...............一个
8 ............... b
2 ...............Ç
8 ............... d
打印c
打印a,b和d

货号..........让
4 ...............一个
1 ............... b
7 ...............Ç
3 ............... d
打印b
打印d
打印一个 打印c

货号..........让
3 ...............一个
3 ............... b
10 .............Ç
1 ............... d
打印d
打印a和b
打印c

货号..........让
10 ...............一个
10 ............... b
10 ...............Ç
10 ............... d
打印a,b,c和d

我知道如何循环并将逗号和“和”放入,但我不知道如何分组和排序。 使用python 2.7执行此操作。

顺便说一下,我正在尝试学习python,所以请解释代码的含义。我学的越多,我就越不依赖陌生人的善意。

提前感谢cagillion。

1 个答案:

答案 0 :(得分:1)

下面的讨论。

from collections import defaultdict

def pretty_print_lst(lst):
    if not lst:
        return ""
    elif len(lst) == 1:
        return lst[0]
    elif len(lst) == 2:
        # Join together two letters using " and " as the join.
        return " and ".join(lst)
    else:
        # Use a "list slice" to join all in the list but the last item,
        # using ", " as the join, then append " and " and append the
        # last item.  Last item is indexed with -1, which always works no
        # matter how many or few items are in the list.
        return ", ".join(lst[:-1]) + " and " + lst[-1]

def print_rec(seq):
    # group according to counts
    d = defaultdict(list)
    for row in seq:
        n, letter = row  # get count and letter from the row
        d[n] += letter  # append letter to that count list

    # get a list of (key, value) pairs
    # so the list entries are: (count, list_of_letters)
    results = list(d.items())
    results.sort()
    if len(results) == 1 and results[0][0] == 0:
        # if all 4 letters have a count of 0, 
        print("No data")
    else:
        for count, lst in results:
            s = pretty_print_lst(lst)
            print(s)

lst = [ (8, 'a'), (8, 'b'), (2, 'c'), (8, 'd')]
print_rec(lst)

我们使用字典来收集具有相同计数的项目。这是一个" defaultdict&#34 ;;每当我们引用一个不存在的密钥时,就会创建它,在这种情况下是一个空列表。所以我们可以附加值,如果dict是空的也没关系。

然后我们收集非零项目并制作一个列表,然后漂亮打印列表以匹配您想要的格式。

如果您有任何疑问,请随时提出。