【问题标题】:List comprehension to extract a list of tuples from dictionary列表理解从字典中提取元组列表
【发布时间】:2011-07-19 08:10:46
【问题描述】:

我想在以下列表中使用列表推导;

movie_dicts = [{'title':'A Boy and His Dog', 'year':1975, 'rating':6.6},
           {'title':'Ran', 'year':1985, 'rating': 8.3},
           {'title':'True Grit', 'year':2010, 'rating':8.0},
           {'title':'Scanners', 'year':1981, 'rating': 6.7}]

使用我的列表理解和字典知识,我知道

movie_titles = [x['title'] for x in movie_dicts]
print movie_titles

将打印包含电影标题的列表。

为了提取我尝试过的 (title, year) 元组列表 -

movie_tuples = [x for ('title','year') in movie_dicts]
print movie_tuples

我收到错误 SyntaxError: can't assign to literal

我不确定如何使用列表推导获取两个(特定的)键/值对(这样做会自动生成一个元组?)

【问题讨论】:

    标签: python list list-comprehension tuples


    【解决方案1】:
    movie_dicts = [
        {'title':'A Boy and His Dog', 'year':1975, 'rating':6.6},
        {'title':'Ran', 'year':1985, 'rating': 8.3},
        {'title':'True Grit', 'year':2010, 'rating':8.0},
        {'title':'Scanners', 'year':1981, 'rating': 6.7}
    ]
    
    title_year = [(i['title'],i['year']) for i in movie_dicts]
    

    给予

    [('A Boy and His Dog', 1975),
     ('Ran', 1985),
     ('True Grit', 2010),
     ('Scanners', 1981)]
    

    或

    import operator
    fields = operator.itemgetter('title','year')
    title_year = [fields(i) for i in movie_dicts]
    

    给出完全相同的结果。

    【讨论】:

    • 实际上括号 是 在 LC 中是必需的:P 你可以在赋值、返回、屈服语句中省略它们(几乎在其他任何地方,这些都是我能想到的正确的现在)。
    • 如果你使用的是itemgetter,你也可以只使用map(fields, movie_dict)而不是LC
    【解决方案2】:

    这个版本有最少的重复:

    >>> fields = "title year".split()
    >>> movie_tuples = [tuple(map(d.get,fields)) for d in movie_dicts]
    

    【讨论】:

      【解决方案3】:
      [(movie_dict['title'], movie_dict['year']) for movie_dict in movie_dicts]
      

      请记住,xs = [expr for target in expr2] 等效于(为了简单起见,几乎 - 忽略 StopIteration):

      xs = []
      for target in expr2:
          xs.append(expr)
      

      所以target 需要是一个普通的旧变量名或一些要解压到的元组。但是由于movie_dicts 不包含要从中解压缩的序列,而是简单的单个值(dicts),因此您必须将其限制为一个变量。然后,当您追加到正在生成的列表时,您可以创建一个元组并对当前项目执行任何其他操作。

      【讨论】:

        【解决方案4】:

        如果您不必使用列表推导式,您总是可以这样做:

        list(d.iteritems())
        

        【讨论】:

          猜你喜欢
          • 2019-04-03
          • 1970-01-01
          • 1970-01-01
          • 2014-12-06
          • 2021-11-12
          • 2021-01-01
          • 2020-09-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多