将元组列表转换为字典并保留重复项

时间:2016-03-10 01:02:23

标签: python dictionary

我试图将我的元组列表转换为包含该位置值的dict,并加入列表中。 dict做了我想要的,除了它删除了重复,这是我不想要的!

以下是发生的事情:

>>> vals
[(5, u'3'), (5, u'3'), (8, u'1'), (8, u'1')]
>>> dict(vals)
{8: u'1', 5: u'3'}

这就是我想要发生的事情

>>> vals
[(5, u'3'), (5, u'3'), (8, u'1'), (8, u'1')]
>>> foo(vals)
{8: [u'1',u'1'], 5: [u'3',u'3']}

是否有其他python函数(在上述情况下为foo)才能执行此操作?

5 个答案:

答案 0 :(得分:4)

使用setdefault

可以轻松完成
 {
title: 'Event',
start: '2016-03-26T11:00:00',
end: '2016-03-26T12:00:00',
},
    ],
     eventClick: function(event) {
  console.log(event)
    // alert(event.start.format('MMMM Do YYYY'))
  var start = event.start.format('MMMM Do YYYY'),
    end = event.end.format('MMMM Do YYYY'),
    html = '<p>Starts: ' + start + '<p>';
  html += '<p>Ends: ' + end + '<p>';
  var modal = $("#modal");
  modal.find(".modal-title").html(event.title);
  modal.find('.modal-body').html(html)
  modal.modal();
    }
});
});
});//]]>

          </script>
        <script type="text/javascript"> 

          $(document).ready(function() {
// Generate a simple captcha
function randomNumber(min, max) {
    return Math.floor(Math.random() * (max - min + 1) + min);
}

function generateCaptcha() {
    $('#captchaOperation').html([randomNumber(1, 100), '+', randomNumber(1, 200), '='].join(' '));
}

generateCaptcha();

$('#contactForm')
.formValidation({

})
.on('success.form.fv', function(e) {
    // Prevent default form submission
    e.preventDefault();

    // Change these values to match with your application
    var MANDRILL_API_KEY = 'YOUR-MANDRILL-API-KEY',
        EMAIL_SUBJECT    = 'Find Volunteerships - Sign Up Confirmation ',


    var $form = $(e.target),
        // Generate a message based on submitted form data
        body  = [
            '<strong>Name:</strong> ' +     $form.find('[name="firstName"]').val() + ' ' + $form.find('[name="lastName"]').val(),
            '<strong>School</strong> ' + ($form.find('[name="school"]').val() || 'n/a'),
            '',
            '<strong>Message:</strong> ',
            $form.find('[name="school"]').val()
        ].join('<br/>');

    // Send the message
    $.ajax({
        type: 'POST',
        url: 'http://mandrillapp.com/api/1.0/messages/send.json',
        contentType: 'text/plain',
        dataType: 'json',
        data: {
            key: MANDRILL_API_KEY,
            message: {
                from_name: $form.find('[name="fullName"]').val(),
                from_email: $form.find('[name="email"]').val(),
                to: [
                    {
                        email: $form.find('[name="email"]').val(),
                       name: $form.find('[name="fullName"]').val(),
                        'type': 'to'
                    }
                ],
                auto_text: true,
                subject: EMAIL_SUBJECT,
                html: body
            }
        }
    }).done(function(response) {
        // Clear the form
        $form.formValidation('resetForm', true);

// Regenerate the captcha

.on('err.form.fv', function(e) {
        // Regenerate the captcha
        generateCaptcha();
    });

        // Show the message
        response.status === 'error'
            ? $('#alertContainer')
                .removeClass('alert-success')
                .addClass('alert-warning')
                .html('Sorry, cannot register the sign up')
                .show()
            : $('#alertContainer')
                .removeClass('alert-warning')
                .addClass('alert-success')
                .html('Your sign up has been successfully registered')
                .show();
    }).fail(function(jqXHR, textStatus, errorThrown) {
        $('#alertContainer')
            .removeClass('alert-success')
            .addClass('alert-warning')
            .html('Sorry, cannot register the sign up')
            .show();
    });

(使用def foo(some_list): result = {} for k, v in some_list: result.setdefault(k, []).append(v) return result 比使用setdefault效率更高,因为我们会在附近进行追加)

答案 1 :(得分:2)

我建议使用流行的模块集合和 defaultdict

from collections import defaultdict
vals = [(5, u'3'), (5, u'3'), (8, u'1'), (8, u'1')]
def foo(lst):
    d = defaultdict(list)
    for key, value in lst:
        d[key].append(value)
    return d
print foo(vals)
# defaultdict(<type 'list'>, {8: [u'1', u'1'], 5: [u'3', u'3']})

答案 2 :(得分:1)

你可以这样做:

def foo(vals):
    x = {}
    for k, v in vals:
        x[k] = x.get(k, []) + [v]
    return x

我使用x.get(k, []),以便如果k已经在x中,我们会在其末尾添加put v,但如果不是,我们会将v放在[]的末尾,并将其用于x[k]。更长,但更快的方法是首先检查是否存在,如果存在,则附加到它。这更快,因为我们每次都不创建新列表:

def foo(vals):
    x = {}
    for k, v in vals:
        if k in x:
            x[k].append(v)
        else:
            x[k] = [v]

您也可以使用try-except块执行此操作:

def foo(vals):
    x = {}
    for k, v in vals:
        try:
            x[k].append(v)
        except KeyError:
            x[k] = [v]

答案 3 :(得分:1)

dict的值应该是列表,您在密钥不存在时分配,如果密钥已存在,则附加到该列表。

def foo(some_list):
  result = {}
  for k,v in some_list:
    if k in result:
      result[k].append(v)
    else:
      result[k] = [ v ]
  return result     

答案 4 :(得分:1)

您还可以使用defaultdict

from collections import defaultdict

vals = [(5, u'3'), (5, u'3'), (8, u'1'), (8, u'1')]

d = defaultdict(list)
for key, value in vals:
    d[key].append(value)