迭代列表时将错误放入python中的键值对时出错

时间:2017-09-02 13:52:38

标签: python python-2.7 python-3.x subprocess

我是python的新手。我有一个python列表 old_ecim_mims_list ,如下所示: -

['ReqSyncPort_v2_5_0', 'ECIM_SwM_v2_1_0_2_2', 'ECIM_SwM_v3_0_0_2_3', 'ResPowerDistribution_v1_0_0', 'ECIM_SwM_v4_2_0_3_2', 'ResPowerDistribution_v3_4_1', 'LratBb_v1_8025_0']

现在我的要求就是迭代它并将其放入一个类似于键值对结构的地图中: -

ReqSyncPort=ReqSyncPort_v2_5_0
ECIM_SwM=ECIM_SwM_v2_1_0_2_2,ECIM_SwM_v3_0_0_2_3,ECIM_SwM_v4_2_0_3_2
ResPowerDistribution=ResPowerDistribution_v1_0_0,ResPowerDistribution_v3_4_1
LratBb=LratBb_v1_8025_0

我为此做了一个示例程序但是在执行时遇到错误: -

old_ecim_mims_map={} ;
for index , item in enumerate(old_ecim_mims_list) :
    print(index , item ) ;
    split_str=item.split("_v");
    #print(split_str[0]);
    if split_str[0] in old_ecim_mims_map :
        new_prop_map[split_str[0]].append(item);
        #old_ecim_mims_map.update({split_str[0]:item }) ;
    else :
        old_ecim_mims_map[split_str[0]]=item ;

错误: -

Traceback (most recent call last):
  File "F:/DeltaProject/com/dash/abinash/DeltaOperation/Createdelta.py", line 50, in <module>
    new_prop_map[split_str[0]].append(item);
AttributeError: 'str' object has no attribute 'append'

建议我在哪里做错了。搜索了很多概念,但那些对我帮助不大。任何帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:2)

您的代码失败是因为您在字典(地图)中添加了字符串作为值,而不是将其封装在var a = 15; function checkScope(a) { var a; // this is equivalent to redeclaring the variable console.log(a); // log outputs 15 and not undefined } checkScope(a);中以在最后一行([])中创建数组。下次遇到相同的密钥时,您会尝试附加到字符串,而不是数组。

您必须做的(并且设法做)首先检查某个键是否已经存在于地图中。如果是,则可以附加到列表old_ecim_mims_map[split_str[0]]=item。如果没有此类密钥,则会引发old_ecim_mims_dict[key],然后您必须创建新列表并将KeyError放入其中。

el

此代码更清晰。如果要重写代码,只需将最后一行更改为

old_ecim_mims_list = ['ReqSyncPort_v2_5_0', 'ECIM_SwM_v2_1_0_2_2', 'ECIM_SwM_v3_0_0_2_3', 'ResPowerDistribution_v1_0_0', 'ECIM_SwM_v4_2_0_3_2', 'ResPowerDistribution_v3_4_1', 'LratBb_v1_8025_0']
old_ecim_mims_map = {}

for el in old_ecim_mims_list:
    key, _ = el.split('_v')
    try:
        old_ecim_mims_map[key].append(el)
    except KeyError:
        old_ecim_mims_map[key] = [el]

修改:根据评论中的建议,虽然我更喜欢这个,但可以通过检查old_ecim_mims_map[split_str[0]]=[item] 是否在地图中来完成:

key