我有一个包含一个值和一个列表的对象。现在我有一个这些对象的列表,并希望将所有值和列表连接成一个大型列表。
这是我目前的状态:
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()
。
答案 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']]