【问题标题】:Nested List Comprehensions Example嵌套列表理解示例
【发布时间】:2018-04-16 12:18:44
【问题描述】:

问题

我有下一个列表:

a = (('_a_1', '_a_2'), [0.3, 0.6]) 
b = (('_a_3', '_a_4'), [0.15, 0.56]) 
c = (('_a_5', '_a_6'), [0.22, 0.6])

l = [a, b, c]

我不想要的:选择列表的第一个元组并删除 _a_ 标签。 结果:

[['1','2'],['3','4'],['5','6']]

我尝试了什么

我知道我可以使用 列表理解 做到这一点。但我无法理解它:D 我正在尝试:

[ el.replace('_a_','') for m in l for el in m[0]]

结果:

['1', '2', '3', '4', '5', '6']

我认为它已接近正确的解决方案。只需添加如下内容:

[ [el.replace('_a_','') for m in l] for el in m[0]]

但它不起作用......

【问题讨论】:

  • 你能用文字解释一下你的理解是什么吗?这将帮助您澄清更多,而不是在这里和那里添加随机括号
  • @MadPhysicist 我想将内部循环放入列表[]
  • @Mikhail_Sam 您发布的声称可以工作的代码实际上没有。它抛出NameError: name 'm' is not defined
  • @Ev.Kounis你是对的!从错误的地方复制!谢谢。

标签: python list for-loop list-comprehension nested-loops


【解决方案1】:

这是使用str.split的一种方式:

a = (('_a_1', '_a_2'), [0.3, 0.6]) 
b = (('_a_3', '_a_4'), [0.15, 0.56]) 
c = (('_a_5', '_a_6'), [0.22, 0.6])

res = [[i.split('_')[-1], j.split('_')[-1]] for (i, j), k in [a, b, c]]

# [['1', '2'], ['3', '4'], ['5', '6']]

你也可以使用str.replace:

res = [[i.replace('_a_', ''), j.replace('_a_', '')] for (i, j), k in [a, b, c]]

正如@Ev.Kounis 所建议的,你也可以在函数式上写这个:

res = [list(map(lambda x: x.rsplit('_', 1)[-1], k)) for k, _ in [a, b, c]]

嵌套列表推导 require specific ordering,对某些人来说是直观的,但对其他人来说不是。上述解决方案完全避免了它们。

【讨论】:

  • [list(map(lambda x: x.rsplit('_', 1)[-1], k)) for k, _ in [a, b, c]] 可能会稍快一些。尽管如此,+1
  • fyi,使用map 的解决方案要慢两倍以上。
  • @Arne,我并不感到惊讶,但感谢您的关注。我想在你学习的时候看到不同的方式是件好事。
【解决方案2】:

你很亲密:

a = (('_a_1', '_a_2'), [0.3, 0.6]) 
b = (('_a_3', '_a_4'), [0.15, 0.56]) 
c = (('_a_5', '_a_6'), [0.22, 0.6])

l = [a, b, c]

[ [el.replace('_a_','') for el in tup[0]] for tup in l]
# [['1', '2'], ['3', '4'], ['5', '6']]

【讨论】:

  • 这是否意味着,如果我添加内括号,我必须inverse 逻辑:在通常的嵌套循环中,每个内循环都在末尾添加,但这里内循环添加在左侧?
【解决方案3】:
res=[[j.replace("_a_","") for j in i[0]]  for i in l]
#OUT
[['1', '2'], ['3', '4'], ['5', '6']]

【讨论】:

  • 一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决了问题,那么答案会更有帮助。
  • 代码似乎不言自明,没有什么复杂的,否则解释:)
  • 好吧,你可以解释为什么最初的尝试失败了,以及你的代码是如何解决这个问题的。 SO不适用于共享工作代码,但要了解为什么某些东西不起作用!干杯
【解决方案4】:

另一种方法是使用zip 函数:

a = (('_a_1', '_a_2'), [0.3, 0.6]) 
b = (('_a_3', '_a_4'), [0.15, 0.56]) 
c = (('_a_5', '_a_6'), [0.22, 0.6])

l = [[elem[0][-1],elem[1][-1]] for elem in list(zip(a,b,c))[0]]

print(l)

输出:

[['1', '2'], ['3', '4'], ['5', '6']]

【讨论】:

    【解决方案5】:

    您可以使用正则表达式而不用拆分它:

    import re
    pattern=r'[0-9]+'
    
    print([tuple(map(lambda x:re.search(pattern,x).group(),i[0])) for i in l])
    

    输出:

    [('1', '2'), ('3', '4'), ('5', '6')]
    

    【讨论】:

      猜你喜欢
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 2013-08-07
      • 1970-01-01
      相关资源
      最近更新 更多