gpt4 book ai didi

python - 利用 "isalpha"或 "startswith"和/或故障排除 "list index out of range error"

转载 作者:太空宇宙 更新时间:2023-11-03 18:47:17 24 4
gpt4 key购买 nike

我在各个方面都是新手(SO、Python、beautifulsoup 等),所以请耐心等待。

我正在尝试按照 Flowingdata.com 上的教程(如何使用免费工具制作美国县专题 map )创建具有不同类型数据的各种 map 。

我可以毫无错误地复制教程,因此没有版本问题(我在 Mac OS 10.8 上使用 Python 2.7.5 和 BeautifulSoup 4.3.1)。我想使用(更详细的)州县 map 并用不同的数据对它们进行着色。我在适当的文件中拥有 map (svg)和数据(csv)。这是我当前正在运行的脚本:

import csv
from BeautifulSoup import BeautifulSoup

totpop = {}
reader = csv.reader(open('datafile.csv', 'rU'), delimiter=",")
for row in reader:
try:
id = row[0]
pop = float( row[1].strip() )
totpop[id] = pop
except:
pass

svg = open('mapfile.svg', 'r').read()

soup = BeautifulSoup(svg, selfClosingTags=['defs', 'sodipodi:namedview', 'path'])

paths = soup.findAll('path')

colors = ["#F1EEF6", "#D4B9DA", "#C994C7", "#DF65B0", "#DD1C77", "#980043"]

path_style = 'fill-rule:nonzero; stroke: #ffffff; stroke-width: 5; stroke-opacity: 1; fill: '

# Colorize based on data
for p in paths:

try:
pop = totpop[p['id']]
except:
continue

if pop > 750000:
color_class = 6
elif pop > 500000:
color_class = 5
elif pop > 250000:
color_class = 4
elif pop > 125000:
color_class = 3
elif pop > 75000:
color_class = 2
elif pop > 25000:
color_class = 1
else:
color_class = 0

color = colors[color_class]
p['style'] = path_style + color


print soup.prettify()

我收到以下错误:

File "scriptname.py", line 54, in color = colors[color_class] IndexError: list index out of range

(“第 54 行”可能不匹配,因为我删除了示例代码中的一些注释行)

对于svg文件来说,它既有路径又有路径组(路径组是由多个路径组成的县)。单路径县将县名称作为“id”。多路径县的县名称作为组“id”,但嵌套路径具有数字 ID。我希望将样式应用于与数据文件中的县名称匹配的路径或组(我完全知道示例代码现在不处理组)。为了测试,我在一个只有路径(没有组)的示例 svg 上运行了脚本,它运行得非常好......所以我知道有些东西是正确的。我认为问题出在带有数字 ID 的组和/或路径(组内)。

如何解决该错误?我尝试删除组并将所有多路径 ID 更改为相同的内容...但这也不起作用。如果没有明确忽略数字 ID,它们是否会导致问题?

我想知道是否可以运行一个脚本,使用某种“isalpha”工具或“startswith”(任何字母)来挑选出具有名称(无数字/数字)的路径和/或组以避免索引错误。

我希望提供足够的信息。

这里是 svg maps 之一的链接(我已经从我的工作文件中删除了clippath和state_outline)这里是相应的datafile的链接

如果您测试这些文件,您可能会遇到 View 框问题,但我已经单独解决了这个问题。

感谢您的帮助!

最佳答案

从外观上看,您可能会假设以下数组:

颜色 = ["#F1EEF6", "#D4B9DA", "#C994C7", "#DF65B0", "#DD1C77", "#980043"]

这里的元素索引为 1, 2, 3, 4, 5, 6。索引实际上是以 0 开头,而不是 1。所以“#F1EEF6”实际上是元素 0 和最后一个元素(“#980043") 是数组中的第 5 号。在 if pop 语句中,您需要进行此调整。

此外,您还需要更改 else 语句,将 color_class 设置为可用于确定是否应尝试获取有效颜色的内容。我在想一些类似的事情:



<前>其他:
颜色类别=空

如果 color_class != null
颜色 = 颜色[颜色类别]
p['样式'] = 路径样式 + 颜色

我不熟悉 Python 语法,因此其中可能存在错误,但希望您能明白我在这里试图展示的想法。

关于python - 利用 "isalpha"或 "startswith"和/或故障排除 "list index out of range error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19225619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com