2016-03-17 46 views
0

我是一名Python初学者。我需要做一个组连接。我尝试了不同的方式,但不能拿出任何最终的东西。Python - 基于条件的组Concat行

我有一个数据集:

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

我需要它组为以下格式

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

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

+1

当你说数据集..你的意思是在一个文件或列表或? –

+1

看看'itertools.groupby' https://docs.python.org/2/library/itertools.html#itertools.groupby – pna

+0

它是一个excel文件。约30000个订单项 – LEJ

回答

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. 试图在words的字母键处添加word值的列表。
  5. 如果失败(密钥不存在),它将其添加为新的密钥和值。
  6. 遍历各一个,并很好地打印出来:)
+1

此外文件处理不太好。你不应该把整个文件读入内存;遍历文件对象更好。 – mhawke

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使得收集物品进入名单比管理标准字典要容易得多,因为你没有n在添加之前检查密钥是否已经存在于字典中。

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