【问题标题】:How to make a list from several nested lists [duplicate]如何从几个嵌套列表中创建一个列表[重复]
【发布时间】:2013-06-03 08:09:07
【问题描述】:

我有以下嵌套列表(全部在一个列表中:一个主列表(Master)包含两个列表,它们都包含在一个列表中)

Master = \
["E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin [u'BGD_4_new_district', u'BGD_3_old_district', u'BGD_2_division', u'BGD_1_all', u'BGD_5_Upazilla', u'BGD_4_old_district', u'BGD_6_Union_court', u'BGD_6_Union', u'BD_exposed_coastal_area', u'BD_drought', u'BGD_1_River', u'BGD_1_River_detail', u'BD_international_bnd', u'BGD_1_River_1', u'BGD_7_Mauza', u'test', u'BGD_5_UpazillaAnno', u'BGD_4_new_districtAnno', u'BGD_4_new_districtAnno2']", 
 "E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BCAS_BD_Infrastructure    [u'BD_Health_Infrastructures_1', u'BD_Railway_Establishments_1', u'BGD_roads_1']"]

现在我想创建一个列表(作为 windows 路径),其中一个元素如下:(对于第一个列表)

"E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\u'BGD_4_new_district"

再次包含用于 unicode 的 'u' 字符和 "'" 在它也被删除之后,所以最后它是: 在名为“My_Path”的列表中的元素是

"E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_4_new_district" 
"E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_3_old_district"
..........
..........
"E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BCAS_BD_Infrastructur\\BD_Health_Infrastructures_1"

@马丁·彼得斯 我的 arcpy 代码是

import arcpy,os
p=[]
D=[]
admin="E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb"
arcpy.env.workspace =admin
datasetList = arcpy.ListDatasets("*", "Feature")
for dataset in datasetList:
d=str(dataset)
D.append(d)
dList = arcpy.ListTables() + arcpy.ListFeatureClasses() + arcpy.ListRasters()
for dataset in arcpy.ListDatasets():
    arcpy.env.workspace=os.path.join(admin,dataset)
    dList+=arcpy.ListDatasets()+arcpy.ListFeatureClasses()
    p.append(str(arcpy.env.workspace)+str(arcpy.ListFeatureClasses()))##--this makes list

【问题讨论】:

  • 您有一个包含两个字符串的列表。它们不是嵌套列表。部分元素看起来类似于列表,但它们仍然只是字符串。您在具有 unicode 值的现有列表上调用了 str()
  • 首先向我们展示构建此列表的代码?我可以帮助您修复这些字符串,但如果您不一开始就构建这些值,它会变得更加容易和更好。
  • @Martijn Pieters 我在使用 arcpy 库
  • arcpy 不会产生这样的输出,除非您在某事上调用 str()(或使用字符串格式)。产生Master 的代码是什么?
  • @Martijn Pieters 是的,老板我使用了 str() 格式

标签: python list python-2.6 python-2.x


【解决方案1】:

您有两个字符串,其中包含 嵌入 的 python 列表。它们不是实际的列表。

您可以返回使用ast.literal_eval() 函数将它们制作成带有 unicode 值的列表。感觉就像我们正在修复由其他代码引起的问题,更好的解决方法是首先不构建这些值。

from ast import literal_eval
import os.path

output = []
for entry in Master:
    base, lst = entry.split(None, 1)
    for name in literal_eval(lst):
        output.append(os.path.join(base, name))

这会产生正确的 unicode 路径(在 Windows 上是个好主意):

>>> output
[u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_4_new_district', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_3_old_district', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_2_division', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_1_all', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_5_Upazilla', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_4_old_district', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_6_Union_court', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_6_Union', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BD_exposed_coastal_area', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BD_drought', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_1_River', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_1_River_detail', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BD_international_bnd', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_1_River_1', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_7_Mauza', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\test', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_5_UpazillaAnno', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_4_new_districtAnno', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin\\BGD_4_new_districtAnno2', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BCAS_BD_Infrastructure\\BD_Health_Infrastructures_1', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BCAS_BD_Infrastructure\\BD_Railway_Establishments_1', u'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BCAS_BD_Infrastructure\\BGD_roads_1']
>>> print output[0]
E:\GIS_DOCUMENT\BCAS_Map\BCAS_All.gdb\BD_Admin\BGD_4_new_district

如果可以的话,您希望更改原始代码以生成一个字典,它使用基作为键,并使用名称列表作为值:

{'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BCAS_BD_Infrastructure': [u'BD_Health_Infrastructures_1',
                                                                      u'BD_Railway_Establishments_1',
                                                                      u'BGD_roads_1'],
 'E:\\GIS_DOCUMENT\\BCAS_Map\\BCAS_All.gdb\\BD_Admin': [u'BGD_4_new_district',
                                                        u'BGD_3_old_district',
                                                        u'BGD_2_division',
                                                        u'BGD_1_all',
                                                        u'BGD_5_Upazilla',
                                                        u'BGD_4_old_district',
                                                        u'BGD_6_Union_court',
                                                        u'BGD_6_Union',
                                                        u'BD_exposed_coastal_area',
                                                        u'BD_drought',
                                                        u'BGD_1_River',
                                                        u'BGD_1_River_detail',
                                                        u'BD_international_bnd',
                                                        u'BGD_1_River_1',
                                                        u'BGD_7_Mauza',
                                                        u'test',
                                                        u'BGD_5_UpazillaAnno',
                                                        u'BGD_4_new_districtAnno',
                                                        u'BGD_4_new_districtAnno2']}

【讨论】:

  • 什么鬼!我无法使用它;它带有EOF错误
  • @SharifulIslam:那么您的实际数据包含的内容超出了literal_eval() 所能处理的范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 2013-10-15
  • 2014-02-11
  • 2015-04-29
  • 1970-01-01
  • 2020-10-30
相关资源
最近更新 更多