使用Python切片列表映射数据时的问题

1 投票
5 回答
1558 浏览
提问于 2025-04-16 13:22

我最近的工作之一是把数据从一种格式转换成另一种格式,通常是从 Excel、CSV 或 MS MDB 转换成 XML、SQL,或者根据我收到的具体要求来做,所以每次的转换都不太一样。为了完成这个任务,我开始学习 Python,作为我学习 Lisp 的基础。我每天都在不断学习,实际上在工作中也找到了乐趣。目前我正在努力理解生成器和迭代器,但还不太确定它们具体什么时候需要用到,这也是我现在遇到的困惑。

我想知道在 Python 中,如何正确地使用切片中的一个值来测试某些条件,如果条件满足,就给它赋一个合适的值。当我尝试用 if 和 elif 语句结合 <= 时,结果并不是我想要的。下面的例子只是我创建的许多 if 和 elif 语句中的一个,用来测试条件。

#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',...

5 个回答

1

你在比较字符串。看看这个比较:

>>> "23"<"3"
True
>>> "04"<"3"
True

我觉得你想比较的是整数值。试试这样: ... 如果 int(csvitem[63:64]) 小于等于 3: ... 等等。

1

当你让Python比较东西的时候,它很少会出错。如果你让它比较一个字符串和一个香蕉,它可能会告诉你哪个更大,但这个答案对你来说是没有意义的。

你在比较字符串和数字。应该把数字和数字进行比较:

>>> "3" < "20"
False
>>> "3" < "20"
False
>>> int("3") < int("20")
True

在比较之前,把你的字符串转换成数字,这样就没问题了。

1

你现在是在比较字符串,可能你其实想比较的是数字。可以使用 int() 函数来转换。

if int(csvitem[63]) <= 3:

另外,你可能也想优化一下你的代码,减少那么多的 if 语句。比如你可以这样做:

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 语句上。不过在这种情况下,最好是先建立一个字典,把你的选项放进去,然后像这样使用:

choices_dict = {'1':'<4 hours', ...}
hsa_id = choices_dict.get(cvsitem[63], '')

撰写回答