【问题标题】:Merging three lists into into one dictionary将三个列表合并到一个字典中
【发布时间】:2013-03-19 20:53:06
【问题描述】:

我需要将三个列表合并到一个字典中。这些列表来自读取我格式化的 txt 文件,这里是来自该文件的 sn-p:

maker =['Horsey', 'Ford', 'Overland', 'Scripps-Booth']

year = ['1899', '1909', '1911', '1913']

model = ['Horseless', 'Model T', 'OctoAuto', 'Bi-Autogo']

如下:

car_dict = {'Horsey':1899,'Horseless','Ford':1909,'Model T','Overland' : 1911, 'OctoAuto', 'Scripps-Booth' : 1913, 'Bi-Autogo'}

这是我所做的:

def car_data_merge(car_maker,car_model,car_year):
    car_dict = {}
    car_merge = []

    car_dict = defaultdict(partial(defaultdict,list))

    for (car_maker,car_model,car_year) in zip(car_maker,car_model,car_year):
         car_dict[car_year][car_model].append(car_maker)
    print(car_dict)

当我输入这个时,我得到:

{'Horsey': defaultdict(<class 'list'>, {'1899': ['Horseless']})

未显示列表中的所有数据,我不希望显示 defaultdict

当我尝试以下操作时:

def car_data_merge(car_maker,car_data):
    car_dict = {}
    car_merge = []
    car_merge = zip(car_maker,car_data)  
    car_dict = dict(car_merge)
    print(car_dict)

    ###   car_data holds both year and model   ####

只显示部分数据:

'Horsey':'Horseless',':1909,'Model T

我该怎么办?

【问题讨论】:

    标签: python list dictionary merge


    【解决方案1】:

    这就是你要找的东西吗?

    >>> car_dict = {maker[i]:[year[i], model[i]] for i in xrange(len(maker))}
    >>> car_dict
    {'Overland': ['1911', 'OctoAuto'], 'Horsey': ['1899', 'Horseless'], 'Scripps-Booth': ['1913', 'Bi-Autogo'], 'Ford': ['1909', 'Model T']}
    

    【讨论】:

      【解决方案2】:

      听起来你想要的是:

      {maker: (year, model) for maker, model, year in zip(car_maker,car_model,car_year)}
      

      这会给你:

      {'Horsey':(1899,'Horseless'),'Ford':(1909,'Model T'),'Overland':(1911,'OctoAuto')...}
      

      【讨论】:

        【解决方案3】:

        这是怎么回事:

        >>> maker =['Horsey', 'Ford', 'Overland', 'Scripps-Booth']
        >>> year = ['1899', '1909', '1911', '1913']
        >>> model = ['Horseless', 'Model T', 'OctoAuto', 'Bi-Autogo']
        >>> d = dict(zip(maker,zip(year,model)))
        {'Overland': ('1911', 'OctoAuto'), 'Horsey': ('1899', 'Horseless'), 'Scripps-Booth': ('1913', 'Bi-Autogo'), 'Ford': ('1909', 'Model T')}
        

        【讨论】:

        • 您无需致电list。 Zip 创建一个元组列表,您可以从中创建字典
        • 有人否决了这个答案;他们能解释一下原因吗?
        【解决方案4】:

        zip 的做法是正确的,但请注意:

        The returned list is truncated in length to the length of the shortest argument sequence.

        如果您对此感到满意,您可以将数据压缩到元组列表中,压缩密钥,然后将所有内容交给dict()

        如果您想处理缺失值,请查看 itertools izip_longest (Python 2)zip_longest (Python 3) where

        If the iterables are of uneven length, missing values are filled-in with fillvalue.

        try:
            # Python 2
            from itertools import izip_longest
            zip_longest = izip_longest
        except ImportError:
            # Python 3
            from itertools import zip_longest
        
        from pprint import pprint
        
        
        def main():
            maker =['Horsey', 'Ford', 'Overland', 'Scripps-Booth', 'FutureX', 'FutureY']
            year = ['1899', '1909', '1911', '1913', '20xx']
            model = ['Horseless', 'Model T', 'OctoAuto', 'Bi-Autogo']
        
            car_data = dict(zip(maker, zip(year, model)))
            car_data_longest = {mk: (yr, md) for mk, yr, md in zip_longest(maker, year, model)}
        
            pprint(car_data)
            pprint(car_data_longest)
        

        输出:

        {'Ford': ('1909', 'Model T'),
         'Horsey': ('1899', 'Horseless'),
         'Overland': ('1911', 'OctoAuto'),
         'Scripps-Booth': ('1913', 'Bi-Autogo')}
        {'Ford': ('1909', 'Model T'),
         'FutureX': ('20xx', None),
         'FutureY': (None, None),
         'Horsey': ('1899', 'Horseless'),
         'Overland': ('1911', 'OctoAuto'),
         'Scripps-Booth': ('1913', 'Bi-Autogo')}
        

        【讨论】:

        • 问题:我以前从未使用过 izip,我得到values = itertools.izip(year, model) AttributeError: 'module' object has no attribute 'izip' 我该怎么办?
        • @ThomasJones 这是izip_longest
        • @ThomasJones 您使用的是什么版本的 Python? itertools.izip 在 Python 2.3 中添加并在 Python 2.4 中进行了修改。 itertools.izip_longest 是 Python 2.6 中的新功能。
        • python 3.3.0 是我正在使用的,我刚刚下载了 2.6,它确实可以工作。谢谢!还有没有办法在 python 3.3.0 中使用?
        • 啊,好点子。 zip() 已经在 Python 3 中返回了一个迭代器。itertools.izip_longest 也变成了 itertools.zip_longestdocs.python.org/3/library/functions.html#zip, docs.python.org/3.3/library/…
        猜你喜欢
        • 2017-01-05
        • 2022-11-14
        • 1970-01-01
        • 2021-04-10
        • 2017-11-27
        • 2013-03-20
        • 1970-01-01
        • 1970-01-01
        • 2011-03-30
        相关资源
        最近更新 更多