Python 在文件中循环并尝试按键分组值
我有一个包含以下内容的文本文件:Python 在文件中循环并尝试按键分组值,python,python-3.x,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('examp
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
如何修改代码以使其正常工作
谢谢
芒果使用
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)))
使用
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)))
我建议扔掉它,使用
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)))
我建议扔掉它,使用
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)))
一个变化最小的实现可能是这样的
with open('example.txt', 'r') as f:
cur_key = None
value_list = []
for line in f.readlines():
key, value = line.split()
value = value.strip()
if not cur_key:
cur_key = key
if cur_key == key:
value_list.append(value)
else:
print(cur_key + ":" + ', '.join(value_list))
cur_key = key
value_list = [value]
print(cur_key + ":" +', '.join(value_list))
输出:
1:cdcdm, dhsajdhsa
2:ffdm, mdff
3:ccdfm, cdmfc, fmdcc
因此,我们需要确保
cur_key
在第一次迭代中有一个值。因此,如果不是None
,则设置它。此外,当我们找到一个新键时,我们不应该将值\u列表
重置为空。它应该设置为该行上读取的值,因此不会跳过留置权。另外,为了抓住最后一行,我们应该在循环的末尾再次打印值。一个最小更改的实现可能是这样的
with open('example.txt', 'r') as f:
cur_key = None
value_list = []
for line in f.readlines():
key, value = line.split()
value = value.strip()
if not cur_key:
cur_key = key
if cur_key == key:
value_list.append(value)
else:
print(cur_key + ":" + ', '.join(value_list))
cur_key = key
value_list = [value]
print(cur_key + ":" +', '.join(value_list))
输出:
1:cdcdm, dhsajdhsa
2:ffdm, mdff
3:ccdfm, cdmfc, fmdcc
因此,我们需要确保
cur_key
在第一次迭代中有一个值。因此,如果不是None
,则设置它。此外,当我们找到一个新键时,我们不应该将值\u列表
重置为空。它应该设置为该行上读取的值,因此不会跳过留置权。此外,为了抓住最后一行,我们应该在循环的末尾再次打印值。我也相信有更好的方法可以做到这一点,但是如果你真的想坚持基本原则,至少使用列表而不是串联文本。下面是您的代码的另一个版本,稍作改动:
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))
我也相信有更好的方法可以做到这一点,但如果你真的想坚持基本原则,至少使用列表而不是连接文本。下面是您的代码的另一个版本,稍作改动:
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))
有没有办法修改我现有的代码?我想用一种特殊的方法来解决这个问题。有没有办法通过修改我现有的代码来解决这个问题?我想用一种特殊的方式来解决这个问题。我希望这个解决方案是无状态的。有没有一种方法可以在不记住整个字典的情况下解决它?我希望解决方案是无状态的。有没有办法不用记住整本字典就能解决这个问题?