通过列表或元组迭代?

时间:2014-02-27 23:45:31

标签: python list tuples

我有一些坐标存储为列表。我正在迭代列表,我想在KML文件中写入坐标。所以我应该最终得到类似以下内容的东西:

<coordinates>-1.59277777778, 53.8271055556</coordinates>
<coordinates>-1.57945488999, 59.8149016457</coordinates>
<coordinates>-8.57262235411, 51.1289412359</coordinates>

我遇到的问题是我的代码会导致列表中的第一项重复三次:

 <coordinates>-1.59277777778, 53.8271055556</coordinates>
 <coordinates>-1.59277777778, 53.8271055556</coordinates>
 <coordinates>-1.59277777778, 53.8271055556</coordinates>

我想我知道它为什么会发生,因为脚本会看到.strip行并在列表中打印第一个项目3次。

这是我的代码:

oneLat = ['53.8041778', '59.8149016457', '51.1289412359']
oneLong = ['1.5192528', '1.57945488999', '8.57262235411']

with open("file",'w') as f:
            f.write('''<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
    <name>TracePlace</name>
    <open>1</open>
    <Style id="Photo">
        <IconStyle>
            <Icon>
                <href>../pics/icon.jpg</href>
            </Icon>
        </IconStyle>
        <LineStyle>
            <width>0.75</width>
        </LineStyle>
    </Style>
<Folder>''')    

coord_pairs = zip(map(float, oneLong), map(float, oneLat))
itemsInListOne = int(len(oneLat))

iterations = itemsInListOne

num = 0

while num < iterations:
    num = num + 1
    for coord in coord_pairs:
        print (str(coord).strip('()'))
        f.write("\t\t<coordinates>" + "-" + (str(coord).strip('()')) + "</coordinates>\n")
        break

f.write('''
</Folder>
        </Document>
        </kml>''')
f.close()

如何获取正确的“映射”坐标以写入KML文件?通过'正确'坐标,我的意思就像我的第一个例子

由于

3 个答案:

答案 0 :(得分:1)

问题在于您的break行。只在第一次迭代后,您就会突破coordPair循环。您的while循环运行len(coordPairs)==3次,因此第一项重复3次。

以下是您的代码,其中包含一些改进(注释):

oneLat = ['53.8041778', '59.8149016457', '51.1289412359']
oneLong = ['1.5192528', '1.57945488999', '8.57262235411']

# Do the negation here, instead of in the string formatting later
coordPairs = zip((-float(x) for x in oneLong), (float(x) for x in oneLat))

with open("file",'w') as f:
    f.write(xmlHeaderStuff) # I've left out your string literal for brevity    

    #I assume the purpose of the two loops, the while loop and for loop,
    #is for the purpose of repeating the group of 3 coord pairs each time?

    for i in range(len(coordPairs)):
        for coord in coordPairs:
            f.write("\t\t<coordinates>{}, {}</coordinates>\n".format(*coord))
            # break <-- this needs to go

    f.write(xmlFooterStuff)

# f.close() <-- this is unnecessary, since the `with` block takes care of
# file closing automatically

答案 1 :(得分:0)

为什么你会这么复杂?您介绍了一些奇怪的num迭代计数器,并没有使用它。我不会调试你的代码,因为它感觉太臃肿,但给你一些工作。

您可以像这样简单地遍历zip对象:

oneLat = ['53.8041778', '59.8149016457', '51.1289412359']
oneLong = ['1.5192528', '1.57945488999', '8.57262235411']


coord_pairs = zip(oneLong, oneLat)
for coord in coord_pairs:
    print( "{}, {}".format(coord[0], coord[1]) )

输出似乎很好:

1.5192528, 53.8041778
1.57945488999, 59.8149016457
8.57262235411, 51.1289412359

我认为你应该能够通过写入文件把它包起来。

编辑:好的,我弄清楚出了什么问题。这在coord_pairs上迭代3次,但循环内部有break,因此它在coord_pairs的第1个元素处停止。这就是第一对重复3次的原因。很抱歉坦白但代码看起来像是在影响下编码。

答案 2 :(得分:0)

不确定为什么要将输入字符串转换为浮点数,这样就可以将它们再次转换为字符串。这是一个单行程序来获取这些字符串的列表:

['<coordinates>-{}, {}</coordinates>'.format(*pair) for pair in zip(oneLong, oneLat)]

打破它......

zip()返回(long,lat)对的元组。

[]理解消耗了zip,为左手部分创建了一个元素。

左手部分使用format()函数用字符串填充模板。

*对扩展了从zip()返回的元组,因此该元组的每个成员都被视为一个单独的参数。如果你不关心这种理解方式,你可以更明确:

['<coordinates>-{}, {}</coordinates>'.format(long, lat) for long, lat in zip(oneLong, oneLat)]

如果你有很多这些,你最好用parens替换[list comprehension],这只会使它成为一个迭代器,所以你不必创建一个中间列表。然后你可以做类似的事情:

lines = ('<coordinates>-{}, {}</coordinates>\n'.format(*pair) for pair in zip(longIter, latIter))
with open('yourFile', 'w') as file:
    for line in lines:
        file.write(line)

longIter和latIter可以是列表,也可以是其他形式的迭代。