在文本文件中将一组值匹配到另一组值

时间:2012-11-17 04:11:10

标签: python list python-3.x

我有一个包含此信息的文本文件:

1961 - Roger (Male)
1962 - Roger (Male)
1963 - Roger (Male)
1963 - Jessica (Female)
1964 - Jessica (Female)
1965 - Jessica (Female)
1966 - Jessica (Female)

如果我想在文件中搜索“Roger”这个词,我希望它打印出该名称的相应年份,即1961年,1962年,1963年。最好的方法是什么?< / p>

我是用字典做的,但后来意识到字典不能有重复的值,文本文件中提到了两次1963,所以它不起作用。

我正在使用Python 3,谢谢。

5 个答案:

答案 0 :(得分:2)

使用名称作为键的字典并将年份存储在列表中:

In [1]: with open("data1.txt") as f:
   ...:     dic={}
   ...:     for line in f:
   ...:         spl=line.split()
   ...:         dic.setdefault(spl[2],[]).append(int(spl[0]))
   ...:     for name in dic :    
   ...:         print (name,dic[name])
   ...:       

Roger [1961, 1962, 1963]
Jessica [1963, 1964, 1965, 1966]

或者您也可以使用collections.defaultdict

In [2]: from collections import defaultdict

In [3]: with open("data1.txt") as f:
   ...:     dic=defaultdict(list)
   ...:     for line in f:
   ...:         
   ...:         spl=line.split()
   ...:         dic[spl[2]].append(int(spl[0]))
   ...:     for name in dic:    
   ...:         print name,dic[name]
   ...:         
Roger [1961, 1962, 1963]
Jessica [1963, 1964, 1965, 1966]

答案 1 :(得分:0)

为什么你不能使用名称上的字典和索引(例如Roger)作为键,并将值作为年份列表(这里[1961,1962,1963]?这对你不起作用?< / p>

因此,在循环结束时,您可以将所有名称统一为年份作为您想要的值。

答案 2 :(得分:0)

使用tuples。它们可以存储在列表中,并进行迭代。

说你的清单如下:

data = [(1961, 'Rodger', 'Male'),
        (1962, 'Rodger', 'Male'),
        (1963, 'Rodger', 'Male'),
        (1963, 'Jessica', 'Female')]

您可以像这样运行查询:

# Just items where the name is Rodger
[(y, n, s) for y, n, s in data if n == "Rodger"]

# Just the year 1963
[(y, n, s) for y, n, s in data if y == 1963]

或者使用更多Pythonic代码:

for year, name, sex in data:
    if year >= 1962:
        print "In {}, {} was {}".format(year, name, sex)
  

1962年,罗杰是男性   1963年,罗杰是男性   1963年,杰西卡是女性

答案 3 :(得分:0)

您始终可以使用正则表达式。

import re

f = open('names.txt')
name = 'Roger'

for line in f.readlines():
    match = re.search(r'([0-9]+) - %s' % name, line)
    if match:
        print match.group(1)

答案 4 :(得分:0)

正如我在评论中所建议的那样:

from collections import defaultdict

result = defaultdict(list)
with open('data.txt', 'rt') as input:
    for line in input:
        year, person = [item.strip() for item in line.split('-')]
        result[person].append(year)

for person, years in result.items():
    print(person, years, sep=': ')

输出:

Roger (Male): ['1961', '1962', '1963']
Jessica (Female): ['1963', '1964', '1965', '1966']