Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 如何对记录进行分组、排序、计数和输出结果_Sorting_Python 2.7_Group By - Fatal编程技术网

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

Sorting 如何对记录进行分组、排序、计数和输出结果,sorting,python-2.7,group-by,Sorting,Python 2.7,Group By,我正在尝试创建一个python脚本,该脚本执行以下操作: 表(dbf或csv-I都可以创建)总是只有4条记录。第二列(Let)的顺序始终为a、b、c、d。第1列(Num)的数字始终在0-10之间,但频率和顺序会有所不同。输出需要按Num排序和分组,并首先输出最小的数字。如果第一列中的数字出现一次,则只输出相应的字母。如果一个数字出现两次(即两行有相同的数字),则每个对应的字母之间输出一个“and”。如果数字显示两次以上,则每个字母之间会有一个逗号,最后一个字母前会有一个“and”。显示的每个字母

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

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

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

“无数据”
1个字母本身
2个字母,由“和”分隔
3个字母,在最后一个字母前用逗号和“and”分隔

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

Num………让
0………..a
0………..b
0………..c
0…………d
打印“无数据”

Num………让
8………..a
8………..b
2………..c
8…………d
打印c
打印a、b和d

Num………让
4………..a
1…………b
7………..c
3…………d
打印b
打印d
打印一个
打印c

Num………让
3………..a
3………..b
10………c
1…………d
打印d
打印a和b
打印c

Num………让
10………..a
10…………b
10………..c
10…………d
打印a、b、c和d

我知道如何循环使用逗号和“and”,但我不知道如何分组和排序。 使用Python2.7执行此操作

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

万分感谢。下面讨论

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”;每当我们引用一个不存在的键时,它就会被创建,在本例中是一个空列表。所以我们可以只附加值,不管dict是否为空

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

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

下面的讨论

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”;每当我们引用一个不存在的键时,它就会被创建,在本例中是一个空列表。所以我们可以只附加值,不管dict是否为空

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


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

我的示例数据可能有点误导。零可以分散在上面的任何表中,它的值可以像任何其他值一样返回,除非您将所有4条记录都设置为零,所以我不想去掉零,如果所有记录都为零,只需打印一个单独的响应即可。不确定这是否会更改代码。此外,如果表是dbf还是csv,这段代码就可以工作了吗?此外,有时为了简洁起见(谁想读小说),我可能会忽略重要的细节(尽管它们当时看起来并不重要,因为我想我可以修改文本)。把第四张桌子拿下来。输出实际上更像是:“字母d有一个1的顺序。字母a和b各有3个顺序。字母c有10个顺序。”表1的输出类似于:“本周没有订单。”我更改了代码,以便它根据您的请求处理零。我还添加了一些评论来帮助您解决这个问题。至于对输出文本的更改,您应该编辑代码并使输出符合您的要求。我相信你能想出如何进行必要的更改,我会回答问题。如果第二列(Let)包含一个或多个单词而不是一个字母,我如何修改此脚本?(如a是苹果,b是香蕉等)@stevehaI看到你的脚本做了什么(这在概念上很有用),但我不知道如何根据我的情况修改它。首先,数据在一个csv文件中,看起来像原始发布中描述的内容(标题,4行数据)。它不是代码中的列表。其次,我还有一些与此非常相似的其他数据,但第二列包含单词(通常为1或2个单词)。此代码在列中的每个字母后面放置逗号,而不是在第二列中的所有信息后面。谢谢你的帮助。我真的很感激解释代码的注释。我的示例数据可能有点误导。零可以分散在上面的任何表中,它的值可以像任何其他值一样返回,除非您将所有4条记录都设置为零,所以我不想去掉零,如果所有记录都为零,只需打印一个单独的响应即可。不确定这是否会更改代码。此外,如果表是dbf还是csv,这段代码就可以工作了吗?此外,有时为了简洁起见(谁想读小说),我可能会忽略重要的细节(尽管它们当时看起来并不重要,因为我想我可以修改文本)。把第四张桌子拿下来。输出实际上更像是:“字母d有一个1的顺序。字母a和b各有3个顺序。字母c有10个顺序。”表1的输出类似于:“本周没有订单。”我更改了代码,以便它根据您的请求处理零。我还添加了一些评论来帮助您解决这个问题。