Как превратить список в словарь в python [duplicate]

Возможно, проблема в конфигурации почтового сервера, чтобы избежать подобных проблем или вам не нужно беспокоиться о проблеме с почтовым сервером, я рекомендую вам использовать PHPMailer , это плагин у которого есть все необходимое для отправки почты, единственное, что вы должны учесть, это иметь SMTP-порт (порт: 25 и 465), включен

require_once 'PHPMailer/PHPMailer.php';
require_once '/servicios/PHPMailer/SMTP.php';
require_once '/servicios/PHPMailer/Exception.php';

$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
       //Server settings
       $mail->SMTPDebug = 0;                                 
       $mail->isSMTP();                                      
       $mail->Host = 'smtp.gmail.com';  
       $mail->SMTPAuth = true;                               
       $mail->Username = 'correo@gmail.com';                 
       $mail->Password = 'contrasenia';                           
       $mail->SMTPSecure = 'ssl';                          
       $mail->Port = 465;                                    

       //Recipients
       $mail->setFrom('correo@gmail.com', 'my name');    
       $mail->addAddress('destination@correo.com');               

       //Attachments
       $mail->addAttachment('optional file');         // Add files, is optional

       //Content
       $mail->isHTML(true);// Set email format to HTML
       $mail->Subject = utf8_decode("subject");
       $mail->Body    = utf8_decode("mail content");
       $mail->AltBody = '';
       $mail->send();
     }
     catch (Exception $e){
        $error = $mail->ErrorInfo;
     }

143
задан Mateusz Piotrowski 27 April 2016 в 14:25
поделиться

13 ответов

b = dict(zip(a[::2], a[1::2]))

Если a велико, вы, вероятно, захотите сделать что-то вроде следующего, что не делает никаких временных списков, подобных приведенным выше.

from itertools import izip
i = iter(a)
b = dict(izip(i, i))

В Python 3 вы может также использовать понимание dict, но по иронии судьбы я думаю, что самый простой способ сделать это будет с range() и len(), который обычно будет запахом кода.

b = {a[i]: a[i+1] for i in range(0, len(a), 2)}

Итак, iter()/izip() по-прежнему, вероятно, самый Pythonic в Python 3, хотя, как отмечает EOL в комментарии, zip() уже ленив в Python 3, поэтому вам не нужно izip().

i = iter(a)
b = dict(zip(i, i))

Если вы хотите его на одной строке, вам придется обмануть и использовать точку с запятой. ; -)

210
ответ дан coldspeed 21 August 2018 в 00:38
поделиться
  • 1
    ... или просто zip(i, i), в Python 3, так как zip() теперь возвращает итератор. – Eric Lebigot 2 January 2011 в 01:07
  • 2
    Обратите внимание, что Python 2.7.3 также имеет понимание dict – user1438003 22 August 2012 в 12:53

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

data=['test1', '1', 'test2', '2', 'test3', '3', 'test4', '4']

keys=[]
values=[]
for i,j in enumerate(data):
    if i%2==0:
        keys.append(j)
    else:
        values.append(j)

print(dict(zip(keys,values)))

:

{'test3': '3', 'test1': '1', 'test2': '2', 'test4': '4'}
0
ответ дан Ayodhyankit Paul 21 August 2018 в 00:38
поделиться

Вы можете легко использовать это понимание:

a = ['hello','world','1','2']

my_dict = {item : a[index+1] for index, item in enumerate(a) if index % 2 == 0}

Это эквивалентно циклу for ниже:

my_dict = {}
for index, item in enumerate(a):
    if index % 2 == 0:
        my_dict[item] = a[index+1]
12
ответ дан Chris Arena 21 August 2018 в 00:38
поделиться

Мне также очень интересно иметь однострочный для этого преобразования, поскольку такой список является инициализатором по умолчанию для хэширования в Perl.

Исключительно полный ответ приведен в этом потоке -

Mine one Я новичок в Python), используя Python 2.7 Generator Expressions , будет:

dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))

37
ответ дан Community 21 August 2018 в 00:38
поделиться

попробуйте ввести код:

  >>> d2 = dict([('one',1), ('two', 2), ('three', 3)])
  >>> d2
      {'three': 3, 'two': 2, 'one': 1}
0
ответ дан Joey Harwood 21 August 2018 в 00:38
поделиться

Я не уверен, что это pythonic, но, похоже, работает

def alternate_list(a):
   return a[::2], a[1::2]

key_list,value_list = alternate_list(a)
b = dict(zip(key_list,value_list))
0
ответ дан Manu 21 August 2018 в 00:38
поделиться

Что-то, что я нахожу довольно крутым, а это то, что если ваш список состоит всего из двух элементов:

ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}

Помните, что dict принимает любой итерабельный, содержащий итерируемый, где каждый элемент в итерабельном должен быть истребитель с двумя объектами.

8
ответ дан rix 21 August 2018 в 00:38
поделиться
  • 1
    быстрый и простой, просто добавьте, если список содержит более двух элементов, затем используйте dict (ls) вместо dict ([ls]). например. если ls = ['a', 'b', 'c', 'd'], тогда dict (ls) – ankit tyagi 21 May 2017 в 11:09
  • 2
    Nice & amp; гладкий. 'каждый элемент в итерабельном должен быть итерабельным с ровно двумя объектами.' является ключевым фактом здесь. – Abhijeet 22 June 2018 в 09:34

Не может быть самым пифоническим, но

>>> b = {}
>>> for i in range(0, len(a), 2):
        b[a[i]] = a[i+1]
3
ответ дан sahhhm 21 August 2018 в 00:38
поделиться
  • 1
    читайте о enumerate – SilentGhost 1 January 2011 в 23:34
  • 2
    enumerate не позволяет указать размер шага, но вы можете использовать for i, key in enumerate(a[::2]):. Тем не менее unpythonic, поскольку конструктор dict может сделать большую часть работы здесь для вас – John La Rooy 1 January 2011 в 23:42
  • 3
    @SilentGhost, gnibbler: Большое спасибо за расширение моих горизонтов! Я обязательно включу его как можно больше в будущем! – sahhhm 2 January 2011 в 00:35
  • 4
    @gnibbler: Не могли бы вы объяснить немного больше о том, как работает for i, key in enumerate(a[::2]): подход? Результирующими значениями пары были бы 0 hello и 1 1, и мне непонятно, как их использовать для создания {'hello':'world', '1':'2'}. – martineau 29 January 2011 в 15:59
  • 5
    @martineau, вы правы. Думаю, я, должно быть, имел в виду enumerate(a)[::2] – John La Rooy 29 January 2011 в 23:32

Вы также можете сделать это так (строка для преобразования здесь, а затем переход в словарь)

    string_list = """
    Hello World
    Goodbye Night
    Great Day
    Final Sunset
    """.split()

    string_list = dict(zip(string_list[::2],string_list[1::2]))

    print string_list
1
ответ дан Stefan Gruenwald 21 August 2018 в 00:38
поделиться

Вы можете сделать это довольно быстро, не создавая дополнительные массивы, поэтому это будет работать даже для очень больших массивов:

dict(izip(*([iter(a)]*2)))

Если у вас есть генератор a, еще лучше:

dict(izip(*([a]*2)))

Вот краткое изложение:

iter(h)    #create an iterator from the array, no copies here
[]*2       #creates an array with two copies of the same iterator, the trick
izip(*())  #consumes the two iterators creating a tuple
dict()     #puts the tuples into key,value of the dictionary
2
ответ дан topkara 21 August 2018 в 00:38
поделиться
  • 1
    это сделает словарь с одинаковыми парами ключей и значений ({'hello':'hello','world':'world','1':'1','2':'2'}) – mik 16 April 2018 в 15:29
  • 2
    Нет, все работает нормально. Пожалуйста, прочтите более внимательно. В нем говорится: «Если у вас есть генератор ... & quot; Если у вас нет генератора, просто используйте первую строку. Второй вариант - это альтернатива, которая была бы полезной, если бы у вас был генератор вместо списка, как и в большинстве случаев. – topkara 19 April 2018 в 01:32
  • 3
    вы правы, извините – mik 19 April 2018 в 08:25
#work~
`
a = ['Openstack','Puppet','Python']
b = {}
c = 0
for v in a:
    b[v] = c
    c+=1
print b

`

-1
ответ дан XiaoSI Lu 21 August 2018 в 00:38
поделиться
0
ответ дан Akshay Nevrekar 31 October 2018 в 19:34
поделиться
38
ответ дан JobJob 31 October 2018 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: