对键值列表进行排序,其中值为词典,需要对词典中的STRING值进行排序

时间:2017-11-30 20:57:20

标签: python sorting dictionary

这是我在python中的列表:

override func viewDidLoad() {

    super.viewDidLoad()

    mainScrollView.frame = view.frame


    imageArray = [#imageLiteral(resourceName: "help0"), #imageLiteral(resourceName: "help1"), #imageLiteral(resourceName: "help2"), #imageLiteral(resourceName: "help3"), #imageLiteral(resourceName: "help4")]



    for i in 0..<imageArray.count{

        let imageView = UIImageView()
        imageView.image = imageArray[i]
        imageView.contentMode = .scaleAspectFit
        let xPosition = self.view.frame.width * CGFloat(i)

        imageView.frame = CGRect(x: xPosition , y: 0, width: self.mainScrollView.frame.width, height: self.mainScrollView.frame.height)



        mainScrollView.contentSize.width = mainScrollView.frame.width * CGFloat(i + 1)
        mainScrollView.addSubview(imageView)

        self.view.sendSubview(toBack: mainScrollView)

    }

我需要对此列表进行排序,以便根据team_name按字母顺序排序输出。请注意team_name是字典的一部分,它是列表的“值”。 所以输出应该是这样的:

team_map = [('31983', {'team_sdsk_list': [], 'team_name': 'Commercials', 'in_progress': 0, 'completed': 0, 'not_started': 0}),
 ('32935', {'team_sdsk_list': [], 'team_name': 'DL Platform', 'in_progress': 0, 'completed': 0, 'not_started': 0}),
 ('32955', {'team_sdsk_list': [{'sdsk_summary': 'Task - BSDM Product Readiness (MiFIR Transparency Data package)', 'parent_target_launch_date': '2017-08-21', 'parent_sdsk_number': 774079489, 'attributes': [{'status': 'Complete', 'label': 'DL CONTENT<BR>UPDATED'}], 'rep': 'abc', 'parent_sdsk_product_mgr': 'xyz', 'sdsk_number': 1234, 'parent_sdsk_summary': 'Data Package'}], 'team_name': 'BSDM', 'in_progress': 0, 'completed': 1, 'not_started': 0})]

我试过了:

[('32955', {'team_sdsk_list': [{'sdsk_summary': 'Task - BSDM Product Readiness (MiFIR Transparency Data package)', 'parent_target_launch_date': '2017-08-21', 'parent_sdsk_number': 774079489, 'attributes': [{'status': 'Complete', 'label': 'DL CONTENT<BR>UPDATED'}], 'rep': 'abc', 'parent_sdsk_product_mgr': 'xyz', 'sdsk_number': 1234, 'parent_sdsk_summary': 'Data Package'}], 'team_name': 'BSDM', 'in_progress': 0, 'completed': 1, 'not_started': 0}),
('31983', {'team_sdsk_list': [], 'team_name': 'Commercials', 'in_progress': 0, 'completed': 0, 'not_started': 0}),
('32935', {'team_sdsk_list': [], 'team_name': 'DL Platform', 'in_progress': 0, 'completed': 0, 'not_started': 0})]

但这给了我一个错误 请帮我解决排序功能。

3 个答案:

答案 0 :(得分:3)

您的输入数据不是字典,而是list tuples。每个tuple第二个元素您要用于使用给定值排序的字典。

sorted_team_map = sorted(team_map, key=lambda x : x[1]['team_name'])

.items()并在访问密钥

之前获取元组的第二项

如何在将来修复此类错误? (如何修复您的代码?):

  • 您的第一次尝试会触发AttributeError: 'list' object has no attribute 'items'错误。哪一个调用items()?:team_map。所以team_map毕竟是list,不需要函数来迭代列表
  • 修复后,您会收到第二个错误:TypeError: tuple indices must be integers, not str。那是因为itemgetter将您的密钥传递给了不是字典而是tuple的东西。你需要更深层次才能到达你的字典。

答案 1 :(得分:2)

您需要访问存储在sorted键中每个元组中最后位置的字典,并使用为"team_name"存储的值:

team_map = [('31983', {'team_sdsk_list': [], 'team_name':'Commercials', 'in_progress': 0, 'completed': 0, 'not_started': 0}),
  ('32935', {'team_sdsk_list': [], 'team_name': 'DL Platform', 'in_progress': 0, 'completed': 0, 'not_started': 0}),
  ('32955', {'team_sdsk_list': [{'sdsk_summary': 'Task - BSDM Product Readiness (MiFIR Transparency Data package)', 'parent_target_launch_date': '2017-08-21', 'parent_sdsk_number': 774079489, 'attributes': [{'status': 'Complete', 'label': 'DL CONTENT<BR>UPDATED'}], 'rep': 'abc', 'parent_sdsk_product_mgr': 'xyz', 'sdsk_number': 1234, 'parent_sdsk_summary': 'Data Package'}], 'team_name': 'BSDM', 'in_progress': 0, 'completed': 1, 'not_started': 0})]
final_team = sorted(team_map, key=lambda x:x[-1]['team_name'])

输出:

[('32955', {'team_sdsk_list': [{'sdsk_summary': 'Task - BSDM Product Readiness (MiFIR Transparency Data package)', 'parent_target_launch_date': '2017-08-21', 'sdsk_number': 1234, 'attributes': [{'status': 'Complete', 'label': 'DL CONTENT<BR>UPDATED'}], 'parent_sdsk_number': 774079489, 'parent_sdsk_product_mgr': 'xyz', 'rep': 'abc', 'parent_sdsk_summary': 'Data Package'}], 'completed': 1, 'in_progress': 0, 'team_name': 'BSDM', 'not_started': 0}), ('31983', {'team_sdsk_list': [], 'completed': 0, 'in_progress': 0, 'team_name': 'Commercials', 'not_started': 0}), ('32935', {'team_sdsk_list': [], 'completed': 0, 'in_progress': 0, 'team_name': 'DL Platform', 'not_started': 0})]

答案 2 :(得分:2)

因此,您希望根据字典的team_map属性对"team_name"列表进行排序,该字典是每个tuple中的第二个元素。

为此,我们采用ttuple)并使用t[1](字典)获取第二个元素,并根据["team_name"]属性进行排序:< / p>

sorted(team_map, key=lambda t: t[1]["team_name"])

给出了预期的输出:

[('32955', {'team_name': 'BSDM', 'team_sdsk_list': [{'parent_target_launch_date': '2017-08-21', 'parent_sdsk_number': 774079489, 'parent_sdsk_product_mgr': 'xyz', 'parent_sdsk_summary': 'Data Package', 'sdsk_summary': 'Task - BSDM Product Readiness (MiFIR Transparency Data package)', 'attributes': [{'label': 'DL CONTENT<BR>UPDATED', 'status': 'Complete'}], 'sdsk_number': 1234, 'rep': 'abc'}], 'completed': 1, 'in_progress': 0, 'not_started': 0}), ('31983', {'team_name': 'Commercials', 'team_sdsk_list': [], 'completed': 0, 'in_progress': 0, 'not_started': 0}), ('32935', {'team_name': 'DL Platform', 'team_sdsk_list': [], 'completed': 0, 'in_progress': 0, 'not_started': 0})]

请注意,不是使用内置的sorted()函数,而是将结果分配回team_map(这是我假设你会做的)。您还可以使用sort team_map.sort列出team_map.sort(key=lambda t: t[1]["team_name"]) 列表。

所以你可以用以下方法获得与上面相同的结果:

.hero{
  position: absolute;
  width: 1200px;
  margin-left: 0;
  margin-top: 0;
}