Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在文件中循环并尝试按键分组值_Python_Python 3.x - Fatal编程技术网

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))

有没有办法修改我现有的代码?我想用一种特殊的方法来解决这个问题。有没有办法通过修改我现有的代码来解决这个问题?我想用一种特殊的方式来解决这个问题。我希望这个解决方案是无状态的。有没有一种方法可以在不记住整个字典的情况下解决它?我希望解决方案是无状态的。有没有办法不用记住整本字典就能解决这个问题?