【问题标题】:return a flattened list from a list comprehension of a nested list从嵌套列表的列表理解中返回一个扁平列表
【发布时间】:2017-03-07 09:47:32
【问题描述】:

我正在尝试创建属于 linux 组的所有用户的扁平列表。
grp.getgrall() 返回的结构是:

[
  grp.struct_group(
                  gr_name='plugdev',
                  gr_passwd='x',
                  gr_gid=46,
                  gr_mem=[
                            'rolf',
                            'public'
                          ])
]

其中组的成员在gr_mem=[]中的列表形式

我可以使用以下内容:

import grp
plugdev_members = []
for group in grp.getgrall():
    if "plugdev" in group.gr_name:
        for user in group.gr_mem:
            plugdev_members.append(user)

返回一个平面列表:

['rolf','public']

使用列表推导:

plugdev_members = [
                    mem for mem in [
                                    m.gr_mem for m in grp.getgrall()
                                       if "plugdev" in m.gr_name
                                   ]
                  ] 
or

plugdev_members = [
                    m.gr_mem for m in grp.getgrall() 
                      if "plugdev" in m.gr_name
                   ]

我在一个列表中得到一个列表:

[['rolf', 'public']]

我确信一定有一种方法可以使用列表理解返回一个扁平列表,我只是没有看到它。根据第一个示例,我知道我需要在第一个循环中进行第二个循环,但我只是没有做对。
任何提示将不胜感激

【问题讨论】:

标签: python list


【解决方案1】:

您在第一个循环中缺少第二个循环:

plugdev_members = [m.gr_mem for m in grp.getgrall() if "plugdev" in m.gr_name]
#                  ^----- This is a list, so pugdev_members will be a list of lists

改为:

plugdev_members = [x for m in grp.getgrall() for x in m.gr_mem if "plugdev" in m.gr_name]

【讨论】:

  • 方程的旧“逆运算”,switcheroo。我从来没有破解过!非常感谢,正是我想要的。
  • @RolfofSaxony 这正是链接的重复问题中的内容。
  • @PeterWood 好的!终于知道了x = [item for sublist in grp.getgrall() for item in sublist.gr_mem if "plugdev" in sublist.gr_name]。谢谢!
猜你喜欢
  • 2020-01-31
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多