我想知道如何在Python上混合列表和dict?我知道在PHP上,我可以这样做:
$options = array(
"option1",
"option2",
"option3" => array("meta1", "meta2", "meta3"),
"option4"
);
问题是python对不同的列表有不同的括号。 ()表示元组,[]表示列表,{}表示字典。似乎没有任何方法可以将它们混合在一起并且我不断遇到语法错误。
我现在正在使用python 2.7。请告知如何正确地做到这一点。
非常感谢,
Rufas
更新1:
我稍微详细说明了我想做的事情。我正在尝试编写一个简单的python脚本来执行一些API请求:
http://www.diffbot.com/products/automatic/article/
相关部分是字段查询参数。它类似于......& fields = meta,querystring,images(url,caption)....所以上面的数组可以写成(在PHP中)
$fields = array(
'meta',
'querystring',
'images' => array('url', 'caption')
);
$ fields将被传递给一个方法进行处理。结果将返回,如下所示:
$json = diffbot->get("article", $url, $fields);
问题是 - 我用PHP编写它没有问题,但是当我尝试用Python编写它时,事情并不像看起来那么简单......
答案 0 :(得分:4)
你可以这样做:
options = {
"option1": None,
"option2": None,
"option3": ["meta1", "meta2", "meta3"],
"option4": None,
}
但在这种情况下options
是一本字典。
如果您需要字典中的订单,可以使用OrderedDict。
如何使用OrderedDict
?
from collections import OrderedDict
options = OrderedDict([
("option1", None),
("option2", None),
("option3", ["meta1", "meta2", "meta3"]),
("option4", None),
])
print options["option3"]
print options.items()[2][1]
print options.items()[3][1]
输出:
['meta1', 'meta2', 'meta3']
['meta1', 'meta2', 'meta3']
None
您可以在此处使用密钥(例如options
)或索引(例如option3
和2
)访问3
。
免责声明。我必须强调,这个解决方案不是PHP和Python之间的一对一映射。 PHP是另一种语言,具有其他数据结构/其他语义等。您不能在Python和PHP的数据结构之间进行一对一的映射。还请考虑Hyperboreus的答案(我给了+1)。它展示了在Python中混合列表和词典的另一种方法。另请阅读下面的讨论。
<强> UPDATE1。强>
你如何处理这样的结构?
您必须检查每种情况下的值的类型。
如果是列表(type(v) == type([])
),您可以加入;
否则你可以按原样使用它。
在这里,我将结构转换为类似URL的字符串:
options = {
"option1": None,
"option2": None,
"option3": ["meta1", "meta2", "meta3"],
"option4": "str1",
}
res = []
for (k,v) in options.items():
if v is None:
continue
if type(v) == type([]):
res.append("%s=%s" % (k,"+".join(v)))
else:
res.append("%s=%s" % (k,v))
print "&".join(res)
输出:
option4=str1&option3=meta1+meta2+meta3
答案 1 :(得分:1)
这似乎做了同样的事情:
options = {0: 'option1',
1: 'option2',
2: 'option4'
'option3': ['meta1', 'meta2', 'meta3'] }
更多信息:
[]
表示列表,即有序集合:[1, 2, 3]
或[x ** 2 for x in [1, 2, 3]]
{}
表示集合,即唯一(可散列)元素和字典的无序集合,即唯一(可散列)键和值之间的映射:{1, 2, 3}
,{'a': 1, 'b': 2}
,{{1 }}
{x: x ** 2 for x in [1, 2, 3]}
表示(除其他外)元组,即不可变的有序集合:()
(1, 2, 3)
也表示生成器:()
您可以按照自己喜欢的方式混合它们(只要字符集的元素和字典的键可以清除):
(x ** 2 for x in (1, 2, 3))
答案 2 :(得分:0)
我很确定我的问题有3个答案,虽然它获得了-1票,但它最接近我想要的。现在很奇怪,当我想把那一个作为“接受的答案”时,它就消失了:(
总结一下,删除的答案建议我应该这样做:
options = [
"option1",
"option2",
{"option3":["meta1", "meta2", "meta3"]},
"option4"
]
这非常适合我想要处理列表中的每个项目。我只是循环遍历所有值并检查其类型。如果是字符串,请按正常方式处理。但是当它是一个字典/列表时,它将以不同的方式处理。
最终,我设法让它发挥作用,我得到了我想要的东西。
特别感谢Igor Chubin和Hyperboreus为我提供建议和想法,以测试和发现我一直在寻找的答案。非常感谢。
谢谢!
Rufas