【问题标题】:How to filter a list of tuples by items at given index and convert them into a dictionary of lists如何按给定索引处的项目过滤元组列表并将它们转换为列表字典
【发布时间】:2020-04-04 20:10:30
【问题描述】:

我有一个如下列表:

Lista = [('amazon', 'Amazon', 1.0), 
         ('amazon', 'Alexa', 0.8), 
         ('amazon', 'microsoft', 0.6), 
         ('amazon', 'Amazon Pay', 0.7), 
         ('amazon', 'Prime', 0.4),
         ('alien', 'jack' , 0.0), 
         ('alien', 'dell', 0.6),
         ('alien', 'apple', 0.0),
         ('alien', 'orange', 0.0),
         ('alien', 'fig', 0.0)]

现在我想执行一个基本检查,看看哪些元组的最后一个值大于 0.0,然后将生成的元组转换为列表的字典:

new_words = {'amazon': ['Amazon', 'Alexa', 'microsoft', 'Amazon Pay', 'Prime'],
             'alien': ['dell']}

我该怎么做?

【问题讨论】:

标签: python list dictionary


【解决方案1】:

您无法在字典中获得所需的结果,因为字典不包含重复的键(类似于普通的英语字典:单词可能拼写相同但发音不同)。

所需的结果可以再次存储到列表中。

newDict = {}
result = []

Lista =[('amazon', 'Amazon', 1.0), ('amazon', 'Alexa', 0.8), ('amazon', 'microsoft', 0.6), ('amazon', 'Amazon Pay', 0.7), ('amazon', 'Prime', 0.4),('alien', 'jack' , 0.0), ('alien', 'dell', 0.6), ('alien', 'apple', 0.0), ('alien', 'orange', 0.0), ('alien', 'fig', 0.0)]

for items in Lista:
    if items[2] > 0.0:
        newDict[items[0]] = items[1]
        result.append(newDict)
        newDict = {}

print result

【讨论】:

  • 感谢您的解决方案。虽然您的解决方案对我有用。我想知道为什么在result.append(newDict) 行之后又调用了 newDict ={}
  • 另外,如果您能像@jan 的解决方案一样以{'amazon': ['Amazon', 'Alexa', 'microsoft', 'Amazon Pay', 'Prime'], 'alien': ['dell']} 的格式向我提供输出,那就太好了
  • 如果我们不清空字典,那么在循环中执行下一次迭代时,新项目将被附加到字典中,我们不希望这样。我不确定我是否完美地解释了它,请尝试不使用该行,您就会明白我的意思。 @jan 已经提供了解决方案,对吧?如果您需要对此进行任何改进,请详细说明,我们将看看如何实现。
  • 感谢拉胡尔的解释。我现在明白了。由于某种原因,Jan 的解决方案对我不起作用,但您的解决方案正在运行,有没有办法可以调整您的代码以提供 Jan 的输出。像这样{'amazon': ['Amazon', 'Alexa', 'microsoft', 'Amazon Pay', 'Prime'], 'alien': ['dell']}
【解决方案2】:

您很可能需要一个列表字典。这是使用itertools.groupby的一种方法:

from itertools import groupby
from operator import itemgetter

{k:[i[1] for i in list(v) if i[2]>0.] for k,v in groupby(Lista, key=itemgetter(0))}

{'amazon': ['Amazon', 'Alexa', 'microsoft', 'Amazon Pay', 'Prime'],
 'alien': ['dell']}

注意:这仅在相等的键是连续的情况下才有效

【讨论】:

  • 这只有在重复键是连续的情况下才有效,所以如果它们不是连续的,你需要先排序。
  • 是的,添加了警告@interjay
【解决方案3】:

你可以使用defaultdict:

from collections import defaultdict

Lista =[('amazon', 'Amazon', 1.0), ('amazon', 'Alexa', 0.8), ('amazon', 'microsoft', 0.6), ('amazon', 'Amazon Pay', 0.7), ('amazon', 'Prime', 0.4),('alien', 'jack' , 0.0), ('alien', 'dell', 0.6), ('alien', 'apple', 0.0), ('alien', 'orange', 0.0), ('alien', 'fig', 0.0)]

dct = defaultdict(list)

for item in Lista:
    key, value, score = item
    if score > 0.0:
        dct[key].append(value)

print(dct)

产量

defaultdict(<type 'list'>, {
    'alien': ['dell'], 
    'amazon': ['Amazon', 'Alexa', 'microsoft', 'Amazon Pay', 'Prime']
})

您的初始请求 - 拥有具有多个相同键的字典 - 在 Python 中是不可能的。

【讨论】:

  • dct = defaultdict(list) 行抛出错误“第一个参数必须是可调用的或无”
  • @venkatttaknev:错误来自您在某处调用了变量list,例如list = 123 隐藏了内置函数 list()。否则代码将完美运行。
猜你喜欢
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2019-04-17
  • 2014-12-09
相关资源
最近更新 更多