我有一个包含以下内容的文本文件:
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
如何修改我的代码才能使其正常工作?
谢谢,
芒果
答案 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))