我正在尝试创建一个执行以下操作的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。
答案 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是空的也没关系。
然后我们收集非零项目并制作一个列表,然后漂亮打印列表以匹配您想要的格式。
如果您有任何疑问,请随时提出。