【问题标题】:Using list comprehension to add elements to a string from a reference dict使用列表推导将元素添加到引用字典中的字符串
【发布时间】:2017-09-05 21:54:36
【问题描述】:

我的字典如下:

s = {'lorem': set(['test1', 'test2'])}

还有一个文本文件如下:

data = "Lorem ipsum dolor sit amet consectetur adipiscing elit"

我写了一个脚本如下:

[[word, s[word]] if word in s else word for word in data.lower().split()]

它会输出一个如下所示的列表:

[['lorem', set(['test1', 'test2'])], 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipiscing', 'elit']

如何重写上述脚本以输出以下列表:

['lorem', 'test1', 'test2', 'ipsum', 'dolor', 'sit', 'amet', 'onsectetur', 'adipscing', 'elit']

【问题讨论】:

  • @TheoretiCAL - 是的,绝对想保留原来的“lorem”
  • 那不算是“替换”,而是加词。请更正描述,因为它具有误导性。
  • ok @alfasin - 将更新以反映这一点。
  • 在一行中做所有事情并不能让它运行得更快、更易读或更容易维护。请记住这一点!

标签: python python-2.7 list dictionary list-comprehension


【解决方案1】:

您可以展开列表理解右侧的集合。使用 dict.get 而不是测试 dict 中项目的包含情况:

lst = [w for word in data.lower().split() for w in [word] + list(s.get(word, ()))]
print(lst)
# ['lorem', 'test1', 'test2', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipiscing', 'elit']

【讨论】:

  • 太酷了!我没想到你可以那样做……太棒了,太优雅了……谢谢!
【解决方案2】:

你可以试试这个:

from itertools import chain
s = {'lorem': set(['test1', 'test2'])}

data = "Lorem ipsum dolor sit amet consectetur adipiscing elit"

new_data = [[i, list(s[i.lower()])] if i.lower() in s else [i] for i in data.split()]
final_data = list(chain.from_iterable([list(chain.from_iterable([[c] if not isinstance(c, list) else c for c in i])) if any(isinstance(b, list) for b in i) else i for i in new_data]))

输出:

['Lorem', 'test1', 'test2', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipiscing', 'elit']

【讨论】:

    猜你喜欢
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2023-02-15
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多