用于多个重复密钥文件句柄的python dict
我是python新手。我有下面的测试文件。相同的键在testfile中重复 以下是测试文件输出:用于多个重复密钥文件句柄的python dict,python,python-2.7,Python,Python 2.7,我是python新手。我有下面的测试文件。相同的键在testfile中重复 以下是测试文件输出: Police Station1 kill: 10 dead: 20 Encounter: 5 Police Station2 kill: 15 dead: 20 Encounter: 6 Police Station3 kill: 20 dead: 15 Encounter: 10 如何使用python dict获取死亡和死亡的详细信息。我使用了下面的代码。它只打印警察局3的详细信息,而不打印
Police Station1
kill: 10
dead: 20
Encounter: 5
Police Station2
kill: 15
dead: 20
Encounter: 6
Police Station3
kill: 20
dead: 15
Encounter: 10
如何使用python dict获取死亡和死亡的详细信息。我使用了下面的代码。它只打印警察局3的详细信息,而不打印警察局1和2
代码如下:
d = {}
with open('testfile.txt') as f:
for line in f:
if ":" not in line:
continue
key, value = line.strip().split(":", 1)
d[key] = value
for k, v in d.iteritems():
if k == 'dead':
v = v.strip()
print v
if k == 'kill':
v = v.strip()
print v
我得到以下输出:
15
20
我期待着:
Police Station1
kill: 10
dead: 20
Police Station2
kill: 15
dead: 20
Police Station3
kill: 20
dead: 15
如何处理这种输出并获得上述输出
注:我不坚持认为任何其他方法或解决方案都可以,只要它能产生预期的结果
d = {}
holder = ""
with open('test.txt', 'r') as f:
for line in f:
line = line.strip()
if line != "":
if ":" not in line:
d[line] = {}
holder = line
else:
key, value = line.strip().split(":")
d[holder][key] = value
#here in the below line, you were overwriting the values each time
#so only the values that were assigned last time will remain
#In your case, {'kill': ' 20', 'Encounter': ' 10', 'dead': ' 15'}
#d[key] = value
for k in d:
print k
for item in d[k]:
if item != "Encounter":
print item+" : "+d[k][item]
输出:
警察局1
死亡:10
死亡人数:20
警察局3
死亡:20
死亡人数:15
警察局2
死亡:15
死亡:20你可以试试这个:
f = open('file.txt').read().splitlines()
f = [i.split() for i in f]
f = [i for i in f if len(i) > 0]
results = {''.join(f[i:i+4][0]):{f[i:i+4][b][0]:f[i:i+4][b][1] for b in range(1, 3)} for i in range(0, len(f), 4)}
print results
#gives you: {'PoliceStation1': {'dead:': '20', 'kill:': '10'}, 'PoliceStation2': {'dead:': '20', 'kill:': '15'}, 'PoliceStation3': {'dead:': '15', 'kill:': '20'}}
看起来您需要将容器嵌套更深一层。下面是您的代码,其中有一些调整:
dsub = d = {}
with open('testfile.txt') as f:
for line in f:
line = line.strip() # strip whitespace fore & aft
if not line: # ignore blank lines
continue
if ":" in line:
key, value = line.split(":", 1)
dsub[key] = value
else: # lines without colons are no long ignored: they're the outer-level keys
dsub = d[line] = {} # create a new sub-dictionary
for station, dsub in d.iteritems():
print station, dsub['kill'], dsub['dead']
如果你想从字典中找到一个特定的条目,你不必为了找到它而对整个条目进行迭代,你可以直接查找它,如上面的示例dsub['dead']
所示
注意,在字典迭代中,项目以任意顺序出现。如果这是一个问题,您可以使用
sorted(d.iteritems())
,也可以说from collections import OrderedDict
,并使用它而不是普通的dict
s。您可以发布您想要的结果吗?在您的字典中,使用所有警察局的键覆盖这些值。可能您需要一个列表作为值,您可以在其中附加死计数等预期结果字典是从唯一键到值的映射。如果你想保存“多个值”,使用一个容器作为值并将它们存储在那里。这是一种处理文件、将整个内容读入内存并进行多个中间数据结构转换的非常低效的方法。。。您可以在逐行迭代时直接构建映射。@Ajax1234,我的值正在增加,随机输出在这种情况下,您的建议代码将无法工作,非常感谢您的支持。您的值增加的具体方式和位置是什么?在文件输出中,现在死杀键和遭遇键已经存在,但它的文件输出可能会有所不同,有时它会增加键,死杀键、遭遇键、受伤键等等。我看不出你的编辑是如何改变任何东西的。您的主要问题在这一行:open('file.txt').read().splitlines()
,它将整个文件读取到内存中,然后按行拆分。您不想这样做,而是希望在文件上惰性地迭代。此外,还应使用with块。即使您想这样做,您也应该执行类似于data=list(open('file.txt'))
的操作,而不必重复调用read
和splitlines
。。。一个文件已经在这些行上迭代了!另一个问题是,你使用过程中每个步骤的理解创建中间列表。这将给我所有警察局所有死亡和死亡的总和,我认为我们需要将这些值推送到dict然后打印。因此,在我的回答后,问题中有一个编辑,我已经编辑了我的代码以适应现在的问题,我很高兴它很有用,如果它对您有效,请接受答案。对于k in d.keys():,这是一个反模式,在Python 2中,它会生成一个新的键列表。这是浪费和不必要的,只需直接迭代字典来迭代关键字:for k in d:
。在Python3中,d.key()s
返回一个视图,所以这个问题不适用,但它仍然是多余的。@juanpa.arrivillaga谢谢你的提示,编辑了我的答案谢谢你的支持,我使用了你的代码,它正在打印所有内容。我只想打印kill and dead values我很确定,根据您已经编写的代码判断,您可以找出如何改变打印方式。但是,请参见编辑。