【问题标题】:python 2.7:iterate dictionary and map values to a filepython 2.7:迭代字典并将值映射到文件
【发布时间】:2016-01-27 09:35:45
【问题描述】:

我有一个从 .xml 文件构建的字典列表

list_1=[{'lat': '00.6849879', 'phone': '+3002201600', 'amenity': 'restaurant', 'lon': '00.2855850', 'name': 'Telegraf'},{'lat': '00.6850230', 'addr:housenumber': '6', 'lon': '00.2844493', 'addr:city': 'XXX', 'addr:street': 'YYY.'},{'lat': '00.6860304', 'crossing': 'traffic_signals', 'lon': '00.2861978', 'highway': 'crossing'}]

我的目标是按以下顺序构建一个包含值(不是键)的文本文件: lat,lon,'addr:street','addr:housenumber','addr:city','amenity','crossing'等...

00.6849879,00.2855850, , , ,restaurant, ,'\n'00.6850230,00.2844493,YYY,6,XXX, , ,'\n'00.6860304,00.2861978, , , , ,traffic_signals,'\n'

如果值不存在,则应该有空格。


我尝试使用 for 循环进行循环:

for i in list_1:
    line= i['lat'],i['lon'] 
    print line

如果我添加在某些情况下不存在的值,则会出现问题:

for i in list_1:
    line= i['lat'],i['lon'],i['phone']
    print line

也尝试循环使用 map() 函数,但结果似乎不正确:

for i in list_1:
    line=map(lambda x1,x2:x1+','+x2+'\n',i['lat'],i['lon'])
    print line

也试过了:

 for i in list_1:
    for k,v in i.items():
        if k=='addr:housenumber':
        print v

这次我觉得可能要写的 if/else 条件太多了。


似乎解决方案就在附近。但无法弄清楚解决方案及其最佳方式。

【问题讨论】:

标签: python list python-2.7 dictionary


【解决方案1】:

我希望使用csv 模块,尤其是DictWriterfieldnames 指示字典信息的写出顺序。实际上写标题是可选的:

import csv
fields = ['lat','lon','addr:street','addr:housenumber','addr:city','amenity','crossing',...]
with open('<file>', 'w') as f:
    writer = csv.DictWriter(f, fields)
    #writer.writeheader()   # If you want a header
    writer.writerows(list_1)

如果你真的不想使用csv 模块,那么你可以按照你想要的顺序简单地迭代你想要的字段列表:

fields = ['lat','lon','addr:street','addr:housenumber','addr:city','amenity','crossing',...]
for row in line_1:
    print(','.join(row.get(field, '') for field in fields))

【讨论】:

    【解决方案2】:

    如果您不能或不想使用 csv,您可以执行类似的操作

    order = ['lat','lon','addr:street','addr:housenumber',
             'addr:city','amenity','crossing']
    for entry in list_1:
      f.write(", ".join([entry.get(x, "") for x in order]) + "\n")
    

    这将创建一个列表,其中包含 entry 映射中的值,按 order 列表中的顺序排列,如果映射中不存在该值,则默认为 ""

    如果您的输出是 csv 文件,我强烈建议您使用 csv 模块,因为它还可以正确转义值以及我们现在没有考虑的其他 csv 文件特定的东西。

    【讨论】:

      【解决方案3】:

      谢谢大家 我找到了解决方案。也许它不是那么优雅,但它确实有效。 我制作了一个节点键列表 在另一个列表中查找它们并获取值。

      key_list=['lat','lon','addr:street','addr:housenumber','amenity','source','name','operator']
      list=[{'lat': '00.6849879', 'phone': '+3002201600', 'amenity': 'restaurant', 'lon': '00.2855850', 'name': 'Telegraf'},{'lat': '00.6850230', 'addr:housenumber': '6', 'lon': '00.2844493', 'addr:city': 'XXX', 'addr:street': 'YYY.'},{'lat': '00.6860304', 'crossing': 'traffic_signals', 'lon': '00.2861978', 'highway': 'crossing'}]
      

      解决方案

          final_list=[]
          for i in list:
          line=str()
              for ii in key_list:     
                  if ii in i:         
                      x=ii            
                      line=line+str(i[x])+','         
                  else:           
                      line=line+' '+','           
              final_list.append(line)
      

      【讨论】:

        猜你喜欢
        • 2020-02-19
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 2015-10-17
        • 1970-01-01
        • 1970-01-01
        • 2016-07-06
        • 2018-09-21
        相关资源
        最近更新 更多