Python中的混合列表和Dict

2024-04-29 01:17:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何在Python上混合list和dict?我知道在PHP上,我可以做这样的事情:

$options = array(
    "option1", 
    "option2", 
    "option3" => array("meta1", "meta2", "meta3"), 
    "option4" 
);

问题是python对于不同的列表有不同的括号。()表示元组,[]表示列表,{}表示dict。似乎没有任何方法可以将它们混合在一起,我不断地遇到语法错误。在

我现在使用的是python2.7。请建议如何正确地做这件事。在

非常感谢

鲁法斯

更新1:

我会稍微详细说明一下我想做什么。我试图在这里编写一个简单的python脚本来执行一些API请求:

http://www.diffbot.com/products/automatic/article/

相关部分是字段查询参数。它类似于…&fields=meta,querystring,images(url,caption)。所以上面的数组可以写成(在PHP中)

^{pr2}$

$字段将传递给一个方法进行处理。结果将被返回,如下所示:

$json = diffbot->get("article", $url, $fields);

问题是-我用PHP编写它没有问题,但是当我尝试用Python编写它时,事情并不像看上去那么简单。。。在


Tags: 方法urlfields列表article事情arraydict
3条回答

你可以这样做:

options = {
    "option1": None, 
    "option2": None,
    "option3": ["meta1", "meta2", "meta3"], 
    "option4": None,
}

但是options在本例中是一个字典。 如果您需要字典中的顺序,可以使用OrderedDict。在

如何使用OrderedDict?在

^{2}$

输出:

['meta1', 'meta2', 'meta3']
['meta1', 'meta2', 'meta3']
None

在这里,您可以使用键(如option3)或索引(如23)访问{}。在

免责声明。我必须强调,这个解决方案不是PHP和Python之间的一对一映射。PHP是另一种语言,具有其他数据结构/其他语义等,不能在Python和PHP的数据结构之间进行一对一的映射。请考虑一下hyperoreus的答案(我给了他+1)。它展示了在Python中混合列表和字典的另一种方法。也请阅读我们下面的讨论。在

更新1。

如何处理这些结构?在

您必须检查每种情况下的值类型。 {cd7>你可以加入列表(^); 否则你可以按原样使用它。在

在这里,我将结构转换为类似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

这似乎是在做同样的事情:

options = {0: 'option1',
    1: 'option2',
    2: 'option4'
    'option3': ['meta1', 'meta2', 'meta3'] }

一般来说:

[]表示列表,即有序集合:[1, 2, 3]或{}

{}表示集合,即唯一(哈希)元素的无序集合和字典,即唯一(哈希)键和值之间的映射:{1, 2, 3}{'a': 1, 'b': 2}{x: x ** 2 for x in [1, 2, 3]}

()表示元组,即不可变的有序集合:(1, 2, 3)

()也表示生成器:(x ** 2 for x in (1, 2, 3))

您可以随意混合它们(只要集合的元素和字典的键是散列的):

^{2}$

我很确定我的问题有3个答案,虽然它得到了-1的投票,但它是最接近我想要的。现在很奇怪,当我想把那个作为“公认答案”的时候,它却不见了:

总而言之,删除的答案建议我这样做:

options = [
    "option1", 
    "option2", 
    {"option3":["meta1", "meta2", "meta3"]}, 
    "option4" 
]

这很适合我处理清单上的每一项。我只需遍历所有值并检查其类型。如果它是一个字符串,请像平常一样处理它。但当它是一个dict/list时,它将被不同的处理。在

最终,我成功地做到了,我得到了我想要的。在

特别感谢Igor Chubin和Hyperboreus为我提供了测试和发现我一直在寻找的答案的建议和想法。非常感谢。在

谢谢你!在

鲁法斯

相关问题 更多 >