【问题标题】:using filter to add similar values for a list of tuples使用过滤器为元组列表添加相似的值
【发布时间】:2018-03-27 03:22:06
【问题描述】:

我有这份清单

order = [('5464', 39.96), ('8274', 233.82), ('9744', 404.55), 
         ('5464', 89.91), ('9744', 404.55), ('5464', 89.91), 
         ('88112', 274.89), ('8732', 83.93), ('7733', 208.89), ('88112', 199.75)]

它基本上是一个书单号和总数的列表。我只想使用 filter、map、lambda 和 reduce 来获取一个元组列表,这些元组将添加类似的书单号的值,因此它将返回一个 7 个元组的列表。

【问题讨论】:

  • 非常欢迎您为所欲为,只要合法。但是你的问题是什么? (以问号结尾的那个。)
  • 我该怎么做。所以例如'5464'在列表中出现了3次,所以我希望最后是[('5464',219)]等其余元素
  • 为什么要使用这四个函数?
  • 我的部分任务,我必须特别使用这些功能
  • 好。现在,你自己做了多少,你的代码在哪里?可悲的是,SO 不是代码编写服务。我们不会为您编写代码,但很乐意回答与您发布的代码相关的任何具体问题。

标签: python python-3.x


【解决方案1】:

这是我能做的最好的,虽然可能有更好的方法,也许最好的方法是使用字典,我希望这对你有帮助

print(list(set(map(lambda x: (x[0],sum(map(lambda y:   y[1] if x[0] == y[0] else 0,order) )),order)) ) )

输出

[('9744', 809.1), ('88112', 474.64), ('5464', 219.78), ('8274', 233.82), ('8732', 83.93), ('7733', 208.89)]

【讨论】:

  • 一般来说,你应该避免做别人的家庭作业。
【解决方案2】:

您可以尝试使用 lambda 的 itertools:

import itertools

order = [('5464', 39.96), ('8274', 233.82), ('9744', 404.55),
         ('5464', 89.91), ('9744', 404.55), ('5464', 89.91),
         ('88112', 274.89), ('8732', 83.93), ('7733', 208.89), ('88112', 199.75)]


print(list(map(lambda m:(m[0],sum(map(lambda xa:xa[1],m[1]))),itertools.groupby(sorted(order),key=lambda x:x[0]))))

输出:

[('5464', 219.78), ('7733', 208.89), ('8274', 233.82), ('8732', 83.93), ('88112', 474.64), ('9744', 809.1)]

如果你想使用reduce函数,那么:

print(list(map(lambda x:(x[0],functools.reduce(lambda x,y:x+y,list(map(lambda x:x[1],list(x[1]))))),itertools.groupby(sorted(order),key=lambda x:x[0]))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2019-08-17
    • 2013-05-03
    相关资源
    最近更新 更多