首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python切片列表以映射数据时出现问题

使用Python切片列表以映射数据时出现问题
EN

Stack Overflow用户
提问于 2011-03-10 03:52:12
回答 5查看 923关注 0票数 1

我的一项新职责要求我将数据从一种格式转换或映射到另一种格式,通常是从xcel、csv或ms mdb转换为xml、sql或按照给我的规范,因此通常每个映射都是不同的。我已经开始学习Python来做这件事,作为Lisp的前身。我每天都在学到更多的东西,实际上我的工作也很有趣。我目前正试图将我的大脑围绕生成器和迭代器,但还不确定什么时候需要它们,但这就是我被困的地方。

使用切片中的值来测试特定条件的正确pythonic方法是什么,如果满足,则分配适当的值。当我尝试用<=进行if elif时,我没有得到我想要的结果。下面的示例只是我为测试条件而创建的众多if elif语句中的一个。

代码语言:javascript
复制
#This works
hsa_id = ''
if "1" in csvitem[63:64]:
    hsa_id = '<4 hours'
elif "2" in csvitem[63:64]:
    hsa_id = '<4 hours'
elif "4" in csvitem[63:64]:
    hsa_id = '4-8 hours'
elif "5" in csvitem[63:64]:
    hsa_id = '4-8 hours'
elif "6" in csvitem[63:64]:
    hsa_id = '4-8 hours'
elif "8" in csvitem[63:64]:
    hsa_id = '8-16 hours'
elif "9" in csvitem[63:64]:
    hsa_id = '8-16 hours'
elif "16" in csvitem[63:64]:
    hsa_id = '16-24 hours'
elif "17" in csvitem[63:64]:
    hsa_id = '16-24 hours'
elif "24" in csvitem[63:64]:
    hsa_id = '16-24 hours'
elif "25" in csvitem[63:64]:
    hsa_id = '>24 hours'
else:
    hsa_id = ''
HOURSSINCEAWAKENING.append(hsa_id)

#This does not work. I tried removing the quotes. With and without the quotes I get all identical values.
hsa_id = ''
    if csvitem[63:64] <= "3":
        hsa_id = '<4 hours'
    elif csvitem[63:64] <= "7":
        hsa_id = '4-8 hours'
    elif csvitem[63:64] <= "15":
        hsa_id = '8-16 hours'
    elif csvitem[63:64] <= "23":
        hsa_id = '16-24 hours'
    elif csvitem[63:64] > "23":
        hsa_id = '>24 hours'
    else:
        hsa_id = ''
    HOURSSINCEAWAKENING.append(hsa_id)  

#Output from what does not work truncated for brevity as there are thousands of records.
['<4 hours', '<4 hours', '<4 hours', '<4 hours',...
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-10 04:01:12

您正在比较字符串,并且可能想要比较数字。使用int()

代码语言:javascript
复制
if int(csvitem[63]) <= 3:

也许你还想重构你的代码以消除太多的if。例如,你可以这样做:

代码语言:javascript
复制
data = [(3, '<4'), (7, '4-8'), (15, '8-16'), (23, '16-24'), (10000, '>24']

dattime = int(cvsitem[63])
hsa_id = ''
for mytime, text in data:
    if dattime <= mytime:
        hsa_id = '%s hours' % text
        break

对于代码中的第一个if链,也可以这样做。然而,在这种情况下,最好使用您的选项构建一个字典,然后将其用作:

代码语言:javascript
复制
choices_dict = {'1':'<4 hours', ...}
hsa_id = choices_dict.get(cvsitem[63], '')
票数 1
EN

Stack Overflow用户

发布于 2011-03-10 03:58:19

您正在比较字符串。看看这两个对比:

代码语言:javascript
复制
>>> "23"<"3"
True
>>> "04"<"3"
True

我认为你想要比较整数值。试试这个:...如果int(csvitem63:64) <= 3:...等。

票数 1
EN

Stack Overflow用户

发布于 2011-03-10 04:00:24

当你告诉python比较事物时,它很少会抱怨。如果你告诉它将一个字符串与一个香蕉进行比较,它可能会告诉你一个比另一个大,但答案对你来说是没有意义的。

您正在比较字符串和数字。您应该将数字与数字进行比较:

代码语言:javascript
复制
>>> "3" < "20"
False
>>> "3" < "20"
False
>>> int("3") < int("20")
True

在比较之前将字符串转换为数字,这样就没问题了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5251356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档