【问题标题】:Merge some part of the list together using python使用 python 将列表的某些部分合并在一起
【发布时间】:2014-03-16 01:47:39
【问题描述】:

我有一个非常有趣的问题需要解决。

假设我有一个格式如下的字符串:

input = ['opst tops', 'opst opts', 'opst pots', 'eip pie', 'eip epi']

上面的字符串将帮助我找到单词的字谜。例如,单词“tops”有签名“opts”,同时,单词“opts”也有签名“opst”......因此,所有带有签名“opst”的单词都应该组合在一起,如下所示。输出是单词 anagram 类。

output = ['tops opts pots', 'pie epi']

我是 python 新手,如果您能提供帮助,我将不胜感激。对混乱感到抱歉,希望这是有道理的。

【问题讨论】:

  • 你试过了吗?
  • 应该是:raw = ['opst tops', 'opst opts', 'opst pots', 'eip pie', 'eip epi']?
  • 好的,谢谢你的提醒@da_steve101

标签: python string python-2.7 concatenation


【解决方案1】:

使用collections.defaultdict() object 轻松收集您的话:

from collections import defaultdict

words = defaultdict(list)
for entry in raw:
    key, word = entry.split()
    words[key].append(word)

raw = [' '.join(v) for v in words.values()]

defaultdict 使这里的代码更干净;它只是dict 的一个子类,如果密钥尚不存在,它将调用工厂(此处设置为list)。如果没有defaultdict,您必须使用:

words = {}

在循环中:

words.setdefault(key, []).append(word)

演示:

>>> from collections import defaultdict
>>> raw = ['opst tops', 'opst opts', 'opst pots', 'eip pie', 'eip epi']
>>> words = defaultdict(list)
>>> for entry in raw:
...     key, word = entry.split()
...     words[key].append(word)
... 
>>> [' '.join(v) for v in words.values()]
['pie epi', 'tops opts pots']

如果你的输入列表已经排序并且顺序很重要,你也可以使用itertools.groupb()

from itertools import groupby

raw = [' '.join(w.split()[1] for w in words) 
       for key, words in groupby(raw, key=lambda e: e.split()[0])]

演示:

>>> from itertools import groupby
>>> [' '.join(w.split()[1] for w in words) 
...        for key, words in groupby(raw, key=lambda e: e.split()[0])]
['tops opts pots', 'pie epi']

【讨论】:

    【解决方案2】:

    类似:

    from collections import defaultdict
    
    d = defaultdict(list)
    for s in raw:
        sig, val = s.split(' ')
        d[sig].append(val)
    res = [' '.join(val) for val in d.values()]
    

    请注意,使用字典意味着“签名”可能不会按照输入的顺序出现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 2013-08-01
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      相关资源
      最近更新 更多