Python - 基于条件的组Concat行

时间:2016-03-17 23:47:49

标签: python string concat group-concat

我是Python初学者。我需要做一个连接组。我尝试了不同的方法,但无法做出最终决定。

我有一个数据集:

A   Apple  
A   Orange  
A   Peach  
B   Apricot  
C   Banana  
B   Cherry  
C   Blueberry

我需要将其分组为以下格式

A   Apple, Orange, Peach  
B   Apricot, Cherry  
C   Banana, Blueberry

任何想法。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我相信这可以解决您的问题:

with open('list.txt', 'r') as f:
    file = f.read()
    f.close()
    words = {}
    for line in file.split('\n'):
        letter, word = line.split(' ')
        try:
            words[letter] = words[letter] + [word]
        except KeyError:
            words.update({letter: [word]})

# id = 'A' or 'B' Etc.
for id, word in sorted(words.items()):
    print('{0} {1}'.format(id, word))

<强>输出:

A ['Apple', 'Orange', 'Peach']
B ['Apricot', 'Cherry']
C ['Banana', 'Blueberry']

它在做什么:

  1. 打开您的.txt文件并读取它。完成后关闭它。
  2. 将文件拆分到每一行,并遍历每一行。
  3. 分割成每个字母和单词的行。然后将这些值放入letterword
  4. 尝试在word中的字母键处添加words值列表。
  5. 如果失败(密钥不存在),则将其添加为新密钥和值。
  6. 对每一个进行循环并打印出来很好:)

答案 1 :(得分:0)

以下是使用collections.defaultdict

的解决方案
from collections import defaultdict

with open('input') as f:
    d = defaultdict(list)
    for key, word in (line.split() for line in f):
        d[key].append(word)

    for k in sorted(d):
        print('{} {}'.format(k, ', '.join(sorted(d[k]))))

<强>输出

A Apple, Orange, Peach
B Apricot, Cherry
C Banana, Blueberry

defaultdict使得将项目收集到列表中比管理标准词典要容易得多,因为在添加项目之前,您无需检查项目中是否已存在密钥。

另一种选择是使用itertools.groupby,但这需要数据按顺序排列,因此需要在使用前对文件进行排序。