循环遍历文件并尝试按键分组值

时间:2016-11-07 02:06:49

标签: python python-3.x

我有一个包含以下内容的文本文件:

1   cdcdm
1   dhsajdhsa
2   ffdm
2   mdff
3   ccdfm
3   cdmfc
3   fmdcc

我的目标是让输出看起来像这样:

1 : cdcdm, dhsajdhsa
2 : ffdm, mdff
3 : ccdfm, cdmfc, fmdcc

我编写了以下代码,但出于某种原因,我没有得到预期的输出。

value_list = ''
cur_key = None
key = None
f = open('example.txt', 'r')
for line in f.readlines():
    try:
        key, value = line.split()
        key = key.strip()
        value = value.strip()
        if cur_key == key:
            value_list = value_list + "," + value
        else:
            if cur_key:
                print(cur_key + ":" +value_list)
                cur_key = key
                value_list = ''
            else:
                cur_key = key
    except Exception as e:
        continue

我得到以下输出:

1:,dhsajdhsa
2:,mdff

如何修改我的代码才能使其正常工作?

谢谢,

芒果

4 个答案:

答案 0 :(得分:2)

最低限度更改的实现可能如下所示

1:cdcdm, dhsajdhsa
2:ffdm, mdff
3:ccdfm, cdmfc, fmdcc

输出:

cur_key

因此我们需要确保None具有第一次迭代的值。如果不是value_list,请设置它。另外,当我们找到新密钥时,我们不应将docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://2144765674e460fbd53cf4bfcfb59207 swarm-master重置为空白。它应该设置为该行上读取的值,因此不会跳过留置权。另外为了捕获最后的组行,我们应该在循环结束时再次打印值。

答案 1 :(得分:1)

使用itertools.groupby

import itertools

with open('example.txt') as f:
    for key, strings in itertools.groupby(f, lambda s: s.strip()[0]):
        print('{}: {}'.format(
            key, ', '.join(s.split(None, 1)[1].strip() for s in strings)))

以下是基于您的代码的答案:

value_list = []
cur_key = None
f = open('example.txt', 'r')

for line in f:
    key, value = line.split()
    key = key.strip()
    value = value.strip()
    if cur_key == key or cur_key is None:
        value_list.append(value)
    else:
        print('{}: {}'.format(cur_key, ','.join(value_list)))
        value_list = [value]
    cur_key = key

if value_list:
    print('{}: {}'.format(cur_key, ','.join(value_list)))

答案 2 :(得分:0)

我建议扔掉它并使用collections.defaultdict。然后,您可以将值添加到相应键的列表中,并在完成后打印完成的词典:

import collections

d = collections.defaultdict(list)

with open('example.txt') as f:
    for line in f:
        k,v = line.split()
        d[k].append(v.strip())

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

答案 3 :(得分:0)

我也相信有更好的方法可以做到,但如果你真的想坚持基础,至少使用列表而不是连接文本。这是您的代码的另一个版本,稍有变化:

lists = []
cur_key = None
key = None
f = open('example.txt', 'r')
for line in f.readlines():
    try:
        key, value = line.split()
        key = key.strip()
        value = value.strip()
        if cur_key != key:
            if(cur_key):
                lists.append(value_list)
            value_list = []
            cur_key = key
        value_list.append(value)
    except Exception as e:
        continue
lists.append(value_list)

for i,l in enumerate(lists):
    print(str(i+1) + ' : ' + ', '.join(l))