如何将前2个值作为键,将下一个值作为值

时间:2018-04-23 05:01:23

标签: python dictionary

我想读取一个文件并将每行的前2个值转换为键,将后两个值转换为值

file_name.txt

    a b 1 2
    d e 2 3
    a c 4 6

我想创建一个像这样的字典

 d={'a-b' :(1,2)},'d-e':(2,3)},'a-c':(4,6)}}

我将文件转换为列表,每行都是列表的一个元素:

  v_list=['a b 1 2','d e 2 3','a c 4 6']

我还可以将文件转换为列表,每行中的每个值都作为一个元素:

 v_list=['a','b','1','2','d','e','2','3','a',c','4','6']

但我没有得到正确的引用将此列表转换为具有值元组的嵌套字典。 有人可以建议我如何去做。

5 个答案:

答案 0 :(得分:0)

假设您的文件采用您提供的格式,您可以尝试以下方式:

nested = dict()
with open('file_name.txt', 'r') as f:
    for line in f.readlines():
        tokens = line.strip().split()
        if (nested.get(tokens[0], 0) == 0):
            nested[tokens[0]] = dict()
        nested[tokens[0]][tokens[1]] = (tokens[2], tokens[3])

print(nested)
# prints:
# {'a': {'b': ('1', '2'), 'c': ('4', '6')}, 'd': {'e': ('2', '3')}}

正如有人在评论中指出的那样,dict不能有重复的密钥。此代码将新值添加到现有密钥的dict。

答案 1 :(得分:0)

假设您可以将其读作DataFrame,您可以使用pandas apply函数然后将系列转换为字典。请记住,字典不能有重复键,如您所示。

INSERT INTO tempOrder (productID, cream, sugar)
VALUES (
    Forms!HotCoffee!hotCoffeeChoice.Value,
    Forms!HotCoffee!Cream,
    Forms!HotCoffee!Sugar
)

答案 2 :(得分:0)

你的示例字典无效。密钥只能出现一次。这是词典的关键特征之一。也就是说,假设您关心订单,以下解决方案将起作用。

from collections import OrderedDict

def main():
    d = OrderedDict()
    with open("./file_name.txt", "r") as f:
        for line in f:
            vals = line.split()
            d.setdefault(vals[0], {vals[1]: (vals[2], vals[3])})
print(d)
# OrderedDict([('a', {'b': ('1', '2')}), ('d', {'e': ('2', '3')})])

if __name__ == "__main__":
    main()

答案 3 :(得分:0)

尝试使用您的第一个列表:

java.sql.*

由于你在dict中没有重复的键,你可以尝试将具有相同键的值分组,就像在另一个dict或列表中一样

这里的o / p看起来像是:

v_list = ['a b 1 2', 'd e 2 3', 'a c 4 6']
d = {}
for i in v_list:
    st = i.replace(" ", "")
    d[st[0]+"-"+st[1]] = (st[2], st[3])
print(d)

答案 4 :(得分:0)

假设你的输出是{'a-b':('1','2'),'d-e':('2','3'),'a-c':('4 ','6')}

f = open("data.txt", "r")
d = {}
for i in f.readlines():
    splt = i.split(" ")
    d[splt[0] + "-" + splt[1]] = (splt[2], splt[3])

print(d)