使用列表推导返回每次迭代中的列表

时间:2014-04-27 12:54:47

标签: python list python-3.x list-comprehension

我有一个包含一个值和一个列表的对象。现在我有一个这些对象的列表,并希望将所有值和列表连接成一个大型列表。

这是我目前的状态:

class Language:
    def __init__(self, name, code, *args):
        self.name = name
        self.code = code
        self.alt = args
language_list = [Language("Deutsch", "deu", "de", "ger"), 
                 Language("Español", "spa", "es"), 
                 Language("English", "eng", "en"), 
                 Language("Svenska", "swe", "sv"), 
                 Language("Dansk", "dan", "da"), 
                 Language("ﺎﻠﻠﻏﺓ ﺎﻠﻋﺮﺒﻳﺓ", "ara", "ar"), 
                 Language("Italiano", "ita", "it"), 
                 Language("Français", "fra", "fr")]

print([[ lang.code ] + list(lang.alt) for lang in languages_list])

这会返回一个二维数组:

[["deu", "de", "ger"], ["spa", "es"], ["eng", "en"]…

现在有办法将它合并到一个大型列表中,或者在每次迭代时它基本上都是[].extend()而不是[].append()

3 个答案:

答案 0 :(得分:3)

不,你要么像这样扁平化了

print([item for lang in languages_list for item in [lang.code] + list(lang.alt)])

或者

from itertools import chain
print([item for lang in languages_list for item in chain([lang.code], lang.alt)])

我更喜欢itertools.chain方法,因为它不需要创建长列表,因为lang.alt很长。

答案 1 :(得分:0)

不,这是不可能的,你必须写一个for循环:

langs = []
for lang in languages_list:
    langs.append(lang.code)
    langs.extend(lang.alt)

答案 2 :(得分:0)

实现此目的的OOP方法是为您的班级定义__str____repr__方法:

class Language(object):

    def __init__(self, name, code, *args):
        self.name = name
        self.code = code
        self.alt = args

    def __str__(self):
        return str(list(tuple([self.code]) + self.alt))

    def __repr__(self):
        return str(list(tuple([self.code]) + self.alt))

这会产生:

>>> print Language("Deutsch", "deu", "de", "ger")
['deu', 'de', 'ger']

然后,您可以使用LanguageList类:

进行构建
class LanguageList(list):

    def __str__(self):
        return str([i for i in self])

演示:

>>> language_list = LanguageList([Language("Deutsch", "deu", "de", "ger"), 
                                  Language("Español", "spa", "es"), 
                                  Language("English", "eng", "en"), 
                                  Language("Svenska", "swe", "sv")])

>>> print language_list
[['deu', 'de', 'ger'], ['spa', 'es'], ['eng', 'en'], ['swe', 'sv']]