Dict和List Manipulation Python

时间:2014-10-16 10:02:35

标签: python arrays list dictionary set

我有两个文件,一个有密钥,另一个有密钥和值。我必须匹配文件一的密钥并从文件二中提取相应的值。当所有键和值都是普通列格式时,我可以非常好地获得新文件的键和值。但是当我在set / array类型中时,我不理解如何获得结果。

以列格式输入一个:

5216 3911 2 761.00 
2503 1417 13 102866.00
5570 50 2 3718.00 
5391 1534 3 11958.00 
5015 4078 1 817.00 
3430 299 1 5119.00 
4504 3369 2 3218.00  
4069 4020 2 17854.00 
5164 4163 1 107.00 
3589 3026 1 7363.00 

以列格式输入两个。它们是关键对,即col[0]col[1]都是关键对

5391 1534 
5015 4078 
3430 299 
4504 3369  

上述输入案例的输出,适合我

5391 1534 3 11958.00 
5015 4078 1 817.00 
3430 299 1 5119.00 
4504 3369 2 3218.00 

程序

from collections import defaultdict

edges = {}
with open('Input_1.txt', 'r') as edge_data:    
    for row in edge_data:
        col = row.strip().split()
        edges[col[0], col[1]] = col[2], col[3]
#Then to do the queries, read through the first file and print out the matches:
with open('Input_2', 'r') as classified_data:
    with open ('Output', 'w') as outfile:    
    for row in classified_data:
            a,b = row.strip().split()
        c = edges.get((a,b), edges.get((b,a)))

        #print a,b, edges.get((a,b), edges.get((b,a)))
        #print a,b,c        
        outfile.write("%s %s %s\n" % (a,b,c))

上述程序适用于上述输入类型。但我不知道如何获得以下给定输入的操作。

我理解我应该从上述程序中更改此声明,但我不知道应该将其更改为什么?

edges[col[0], col[1]] = col[2], col[3]

新输入一

('3350', '2542') [6089.0, 4315.0] 
('2655', '1411') [559.0, 1220.0, 166.0, 256.0, 146.0, 528.0, 1902.0, 880.0, 2317.0, 2868.0] 
('4212', '1613') [150.0, 14184.0, 4249.0, 1250.0, 10138.0, 4281.0, 2846.0, 2205.0, 1651.0, 335.0, 5233.0, 149.0, 6816.0] 
('4750', '2247') [3089.0] 
('5305', '3341') [13122.0]

新输入2它们是对的关键,即col[0]col[1]都是关键对

3350 2542
4750 2247
5305 3341

预期输出

3350 2542 6089.0
3350 2542 4315.0
4750 2247 3089.0
5305 3341 13122.0

3 个答案:

答案 0 :(得分:0)

使用模式匹配

import re
rec = re.compile(r"\('(\d+)',\s*'(\d+)'\)\s*\[(.*)\]")
matches = rec.match("('3350', '2542') [6089.0, 4315.0]")
print matches.groups()
print int(matches.group(1))
print int(matches.group(2))
print map(float, matches.group(3).split(','))

输出

('3350', '2542', '6089.0, 4315.0')
3350
2542
[6089.0, 4315.0]

保存数据

a = int(matches.group(1))
b = int(matches.group(2))
data = map(float, matches.group(3).split(','))
edges[a,b] = data

获取数据并打印输出

c = edges.get((a,b), edges.get((b,a)))
for value in c:
   print "%s %s %s\n" % (a,b, value)

答案 1 :(得分:0)

我建议将字符串拆分为不同的字符,例如')'

所以你会做类似的事情:

with open('Input_1.txt', 'r') as edge_data:    
    for row in edge_data:
        col = row.strip().split(')')

然后,您希望将元组和列表的字符串表示转换为可以使用的内容。您可以使用eval()

执行此操作
        key = eval(col[0]+')') # note I add the bracket back in that we split on
        value = eval(col[1])
        edges[key] = value

现在你有一个字典edges,其中的键与文件一中的元组匹配,而值包含相关的列表

当您在文件2中读取时,您将需要添加另一个循环来迭代列表中的条目。例如,像

for c in edges[(a,b)]:
    outfile.write("%s %s %s\n" % (a,b,c))

这将允许您为从第一个文件中读入的列表中的每个条目在输出文件中写一行。

答案 2 :(得分:0)

我认为@ three_pineapples的eval方式非常好而且很棒,

这是另一个只操纵字符串的方法:

edges = {}
with open("Input_1.txt", "r") as edge_data:
    for row in edge_data:
        k, v = row.strip().split(")") # split as key, value
        k = " ".join(i.strip("'") for i in k.strip("(").split(", ")) # clean unwanted symbol and merge together
        v = v.strip(" []").split(", ") # get list value
        edges[k] = v

with open("Input_2", "r") as classified_data:
    for row in classified_data:
        k = row.strip();
        for v in edges.get(k, []):
            print k, v