如何在Python中将元组转换为字符串及反向操作 / 如何编辑网页上的关联数组

1 投票
3 回答
972 浏览
提问于 2025-04-16 15:09

我真正想解决的问题:

我有一个方形的表格,里面是一些真或假的值,行和列用字符串来标记。

我想把这个表格显示成一个网页表单,里面有复选框,让用户可以勾选或取消勾选,然后提交表单,最后我想从这个表单中重新构建出原来的数组。

我现在想解决的一个小问题:

我有一个包含两个字符串的元组,("foo", "bar")。

我想把这个元组变成网页中复选框的名字。

然后当表单提交后,我想把这个字符串再变回原来的元组。

目前我在做的是,用 ("%s$%s" % ("foo", "bar")) 变成 "foo$bar",然后用 string.split('$') 来把字符串分开,这样可以得到原来的字符串,虽然这样可以用,但感觉有点不靠谱,如果字符串里出现了美元符号就会出问题。

显然,我不能直接用 repr 和 eval!

有没有一种合理、标准的方法来做到这一点呢?

3 个回答

1

为什么不直接把结构嵌套起来呢?既然需要一个包含值和描述的矩阵,为什么不这样嵌套呢:

matrix = [
     [{'value': False, 'string':'str1'}, {'value': False, 'string':'str2'}],
     [{'value': False, 'string':'str1'}, {'value': False, 'string':'str2'}],
     ]

现在,matrix[0][0] 就代表一个字典,里面有 stringvalue 这两个键。这样的话,你可以很轻松地把它转换成一个 HTML 表格。

另外,如果你不需要修改的话,也可以使用嵌套的元组。

不过,比较麻烦的是重建数据。你需要仔细构建 name 标签;我建议根据你用来导航矩阵的索引来做,像这样:

print "<table>"
for i in range(0, 2):
    print "<tr>"
    for j in range(0, 2):
        print "<td>"
        item = '<input name="matrix-%d-%d" value=%s>%s<br/>' % (i,j,
                 str(matrix[i][j]["value"]), matrix[i][j]["string"])
        print item
        print "</td">
    print "</tr>"
print "</table>"

接下来,你的任务就是从提交的值中重新创建这个列表,基本上就是把字符串分开,检查一下边界是否合理(是否在预期范围内),然后填充字典的值。

1

你的第二个问题是没法解决的,因为这需要在服务器上记住一些状态。客户端总是被视为不安全的。没有任何合理的方法能让你收到和发送的字符串完全一样。用户总是有办法进行一些黑客攻击。

除非你想用加密的方法来处理这个问题,但我对此表示怀疑 :)

不过,如果你不担心一些小黑客会破坏你的应用,其实有很多方法可以做到,比如你已经做的那样,或者在一个隐藏的字段里保存第一个字符串的长度,这样就可以把剩下的部分留给第二个字符串。或者把字符串分开存储在两个不同的字段里等等。

0

看起来,使用json是比较常见的方式,而且它是Python自带的功能。

首先,我们需要导入json模块:

import json

接着,我们可以把一个元组(类似于列表)转换成json格式:

json.dumps(("hi","there"))

这会输出:'["hi", "there"]'

然后,我们可以把这个json格式的数据再转换回Python的列表:

json.loads('["hi", "there"]')

结果是:[u'hi', u'there']

如果我们把一个包含特殊字符的元组转换成json格式,再转换回来:

json.loads(json.dumps(("hi","th'ere",'the"e$re')))

得到的结果是:[u'hi', u"th'ere", u'the"e$re']

撰写回答