在Python中混合List和Dict

时间:2014-01-02 17:11:42

标签: python list python-2.7 dictionary

我想知道如何在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编写它时,事情并不像看起来那么简单......

3 个答案:

答案 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)或索引(例如option32)访问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