【问题标题】:how to get items in a list of tuple based on the value in tuple如何根据元组中的值获取元组列表中的项目
【发布时间】:2018-09-09 23:39:47
【问题描述】:

我得到一个数据的组合列表并使用 zip 函数对其进行排序

comb_list = sorted(zip(score_list, move_list), key = lambda pair: pair[0], reverse = True)

输出是这样的

a = [(3, (5, 4, False)), (3, (6, 4, False)), (2, (5, 1, False)), 
(1, (6, 2, False)), (-1, (6, 2, False))] 

我想按元组中的第一个元素(在列表中)进行排序,找到最大值,然后输出元组中的第二个元素。这里最大值为3,输出为

[(5, 4, False), (6, 4, False)]

或者如果我有

a = [(3, (5, 4, False)), (2, (5, 1, False)), (1, (6, 2, False)), (-1, (6, 2, False))] 

输出将是

[(5, 4, False)]

【问题讨论】:

  • 如果你只是找到最大值,为什么要排序?
  • 您显然知道如何将key 函数与sorted 一起使用,因为您是在现有代码中这样做的。如果你能写pair[0],你肯定知道如何写pair[1]。那么……您坚持哪一部分?
  • 对不起,其实我是python新手...只能得到(5, 4, False),不能得到[(5, 4, False), (6, 4, False)],虽然它也有最大键。
  • 好的,所以edit 的问题要尽可能多地写,然后解释你卡在哪里,而不是让我们猜测。你得到一堆错误答案的原因是你的问题不清楚。

标签: python list sorting lambda tuples


【解决方案1】:

有比对整个列表进行排序然后过滤更有效的方法,但是由于您已经按键对整个列表进行了排序,并且大概了解了它的工作原理,让我们从这里开始:

a = [(3, (5, 4, False)), (3, (6, 4, False)), (2, (5, 1, False)), (1, (6, 2, False)), (-1, (6, 2, False))] 

所以现在,你想只过滤那些与顶部键相同的键:

b = [(key, value) for key, value in a if key == a[0][0]]

...除了你只想要value,而不是(key, value) 对,这很简单:

b = [value for key, value in a if key == a[0][0]]

现在,为什么这效率低下?好吧,如果您已经对列表进行了排序,那么您实际上不需要检查 每个 值;一旦找到不匹配的内容(例如,itertools.takewhile),您就可以跳出循环。但是,更简单地说,您不需要首先进行排序。只需获取max,然后使用它进行过滤:

comb_list = list(zip(score_list, move_list))
comb_max = max(comb_list, key=lambda pair: pair[0])
b = [value for key, value in comb_list if key==comb_max[0]]

或者,更好的是,您甚至不需要构建中间列表,因为max 首先不需要zip。这也让事情变得更容易理解:

max_score = max(score_list)
b = [move for score, move in zip(score_list, move_list) if score == max_score]

【讨论】:

    【解决方案2】:

    一个非常简单和pythonic的方法来解决它

    >>> max_value = max(a, key=lambda x:x[0])[0]
    >>> max_value
    3
    >>> [x[1] for x in a if x[0]==max_value]
    [(5, 4, False), (6, 4, False)]
    

    您可以使用带键的 max 内置方法:

     >>> a = [(3, (5, 4, False)), (3, (6, 4, False)), (2, (5, 1, False)),
    ... (1, (6, 2, False)), (-1, (6, 2, False))]
    >>> max([(x,list(y)) for x,y in itertools.groupby(sorted(a, key=lambda x:x[0]), key=lambda x:x[0])], key=lambda x:x[0])
    (3, [(3, (5, 4, False)), (3, (6, 4, False))])
    

    【讨论】:

    • 这不是 OP 想要的输出。
    • 更新了我的帖子,看看
    • 但是新版本也不是 OP 想要的输出。
    • @abarnert 你想让我用嘴喂 OP,我得到了值,现在任何人都可以简单地提取。
    • 当有人对如何获得列表中每一对的第一个值感到困惑时,给他一个仍然要求他完全按照他要求如何做的部分的答案并不是很有帮助。替换他确实知道如何使用更有效(但更复杂)的部分很好,但这并不能回答他的问题。
    猜你喜欢
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多