2014-01-02 4 views
0

Мне было интересно, как вы смешиваете список и прописываете вместе на Python? Я знаю на PHP, я могу сделать что-то вроде этого:Список смешивания и Dict в Python

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

Проблемы питон имеет разный кронштейн для другого списка.() для кортежа, [] для списка и {} для dict. Кажется, что нет никакого способа их смешать, и я продолжаю получать синтаксические ошибки.

Я использую python 2.7 сейчас. Пожалуйста, совет, как это сделать правильно.

Большое спасибо,

Rufas

Update 1:

Я немного разрабатывающих, что я пытаюсь сделать. Я пытаюсь написать простой питон скрипт, чтобы сделать некоторые запросы API здесь:

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

Соответствующая часть параметров полей запроса. Это что-то вроде ... & fields = meta, querystring, images (url, caption) .... Таким образом, выше массив может быть записан в виде (в PHP)

$fields = array(
    'meta', 
    'querystring', 
    'images' => array('url', 'caption') 
); 

А $ поля будут переданы к способу обработки. Результат будет возвращен, как это:

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

вещи - У меня нет никакой проблемы в письменном виде его в PHP, но когда я пытаюсь записать его в Python, дело не так просто, как кажется. ..

+0

Нечто подобное? 'x = ['first', 'second', {'third': ['blah']}]' –

+0

это что-то вроде этого: x = ['first', 'second', 'third': ['blah ',' blah '],' four ']. Старайтесь заменить скобки {} здесь и там, чтобы заставить код работать, но это не так. –

ответ

0

Я довольно уверен, что есть 3 ответа на мой вопрос, и в то время как он получил - 1 голос, он ближе всего к тому, что я хочу. Это очень странно, теперь, когда он ушел, когда я хочу, чтобы выбрать, что один в качестве «общепринятом ответ» :(

Напомним, что удаленный ответ предлагаю я должен сделать это:

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

И что припадки что я хочу обработать каждый элемент в списке.Я просто просматриваю все значения и проверяю их тип.Если это строка, обрабатывайте ее как обычно. Но когда это будет dict/list, это будет обрабатываться по-разному.

В конечном счете, мне удалось заставить его работать, и я получаю то, что хочу.

Особая благодарность Игорю Чубину и Гиперборесу за предоставленные мне предложения и идеи, чтобы проверить и найти ответ, который я искал. Очень ценится.

Спасибо!

Rufas

1

Это, кажется, делает то же самое:

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

Больше в целом:

[] обозначения списков, т.е. упорядоченные коллекции: [1, 2, 3] или [x ** 2 for x in [1, 2, 3]]

{} обозначают наборы, т.е. неупорядоченные коллекции уникальных (hashable) элементов и словарей, т.е. отображения между уникальными ключами и значениями (hashable): {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))

Вы можете смешать их любой ва у вам нравится (до тех пор, как элементы набора и ключи словаря является hashable):

>>> a = {(1,2): [2,2], 2: {1: 2}} 
>>> a 
{(1, 2): [2, 2], 2: {1: 2}} 
>>> a[1,2] 
[2, 2] 
>>> a[1,2][0] 
2 
>>> a[2] 
{1: 2} 
>>> a[2][1] 
2 
+0

в этом случае 'options [0] == 'option1'',' options [1] ==' option2'', 'options [2] == 'option4'', но' options [3] == KeyError: 3' –

+0

@adsmith Также в PHP '$ options' не содержит ключа' 3'. Только тот php обрабатывает неизвестные ключи по-разному. – Hyperboreus

+0

+1 к вам за ответ –

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. Пожалуйста, также рассмотрите ответ Гипербореуса (я дал ему +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 
+0

Параметры php '$ options [2]' give ''option4'' ... – Hyperboreus

+0

@Hyperboreus: см. Мою заметку о' OrderedDict' –

+0

Альтернативно можно использовать пустой список ' [] 'вместо' None', чтобы не обозначать никаких элементов. Затем все значения имеют один и тот же тип и могут передаваться в одни и те же функции. (вроде). –

Смежные вопросы