Pep*_*1nt 9 python sorting dictionary loops python-3.x
我有一本需要排序的字典.我知道字典无法排序,所以我正在构建一个列表来执行基于索引的排序.我遇到的问题是多个键上有重复的值; 此外,值可以是多个列表.
字典:
my_dict = {
'1' : ['Red', 'McDonald\'s'],
'2' : [['Orange', 'Wendy\'s'], ['Purple', 'Cookout']],
'3' : ['Yellow', 'Longhorn'],
'4' : ['Green', 'Subway'],
'5' : ['Blue', 'Chipotle'],
'6' : ['Indigo', 'Taco Bell'],
'7' : [['Violet', 'Steak n Shake'], ['Dark Red', 'Five Guys']],
'8' : ['Dark Orange', 'Wendy\'s'],
'9' : ['Aqua', 'Firehouse Subs'],
'10' : ['Magenta', 'McDonald\'s'],
}
Run Code Online (Sandbox Code Playgroud)
我需要能够通过键(数字),颜色和餐厅对其进行排序.我遇到的问题是,当存在重复时,必须对打印进行分组,而我无法弄清楚如何对我正确生成的列表进行排序.
按编号打印的示例:
1:
Red, McDonald's
2:
Orange, Wendy's
Purple, Cookout
3:
Yellow, Longhorn
...
Run Code Online (Sandbox Code Playgroud)
按颜色打印的示例:
Aqua:
Firehouse Subs, 9
Blue:
Chipotle, 5
Dark Orange:
Wendy's, 8
...
Run Code Online (Sandbox Code Playgroud)
我的解决方案是使用列表中的每个键和值创建一个列表.我还是新手,我认为这不是迭代这本词典的正确方法,但它适用于给定的词典.
sorted_number = []
for key, value in my_dict.items():
if len(value[0][0]) > 1:
working_list = (key, value[0][0], value[0][1], value[1][0], value[1][1])
sorted_number.append(working_list)
else:
working_list = (key, value[0], value[1])
sorted_number.append(working_list)
sorted_years = sorted(sorted_years, key=lambda y: y[0][0])
for i in sorted_years:
print('{}:'.format(i[0]))
if len(i) > 3:
print('\t{}, {}'.format(i[1], i[2])
print('\t{}, {}'.format(i[3], i[4]))
else:
print('\t{}, {}'.format(i[1], i[2]))
Run Code Online (Sandbox Code Playgroud)
由于某些值是多个列表,因此if/else语句确定该值是一个还是两个列表.然后,这将正确地生成(数字,颜色,餐馆)或(数字,颜色,餐馆,颜色,餐馆)的列表,然后可以按编号对列表进行排序.问题是当我尝试按颜色或餐厅排序时.我知道我可以使列表只有三个元素,以使排序正常工作,但是当我去打印时,我最终将得到多个2和7.同样的结果是餐厅.而且,这并没有解决多家餐馆的问题.我已经搜索并测试了大约五天尝试不同的方法来解压缩字典,但这是我必须解决这个问题的最接近的方法.任何帮助表示赞赏.提前致谢.
为清楚起见,这是数字的打印迭代:
for i in sorted_number:
print('{}:'.format(i[0]))
if len(i) > 3:
print('\t{}, {}'.format(i[1], i[2]))
print('\t{}, {}'.format(i[3], i[4]))
else:
print('\t{}, {}'.format(i[1], i[2]))
Run Code Online (Sandbox Code Playgroud)
第一步是将字典转换为列表,并将字典值以元组数组的形式均质化。然后使用itertools 模块中的groupBy函数,您可以按所选参数进行分组。
class RestourantSorter:
def __init__(self, source):
self._rList = []
""" Dict to list [(key, color, restourant name), ....] """
for key, value in source.items():
for color, rest in value if isinstance(value[0], list) else [value]:
self._rList.append((key,color,rest))
def _byIndex(self, x):
return int(x[0])
def _byColor(self, x):
return x[1]
def _byName(self, x):
return x[2]
def sort(self, sortFn):
""" Sorted data [(key, [... values ...]), ....] """
groups = []
data = sorted(self._rList, key=sortFn)
for k, g in groupby(data, sortFn):
groups.append((k, list(g)))
return groups
def sortByIndex(self):
return self.sort(self._byIndex)
def sortByColor(self):
return self.sort(self._byColor)
def sortByName(self):
return self.sort(self._byName)
Run Code Online (Sandbox Code Playgroud)
工作REPL