我有一个包含多个记录的字符串,每个记录都有自己的字符串。
x = [{'bsName': 'AC SLEEPER'}, {'bsType': 'ACS'}, {'ischildconcession': 'N'}, {'isseatlayot': 'N'}, {'isseatnmber': 'N'}, {'bsName': 'AC-JANRATH'}, {'bsType': 'JNR'}, {'ischildconcession': 'N'}, {'isseatlayot': 'Y'}, {'isseatnmber': 'Y'}]
数据库中只有5列。
bsName , bsType , ischildconcession , isseatlayot , isseatnmber
所以结果应该是这样......
y = [{'bsName': 'AC SLEEPER', 'bsType': 'ACS', 'ischildconcession': 'N', 'isseatlayot': 'N', 'isseatnmber': 'N'}, {'bsName': 'AC-JANRATH', 'bsType': 'JNR', 'ischildconcession': 'N', 'isseatlayot': 'Y', 'isseatnmber': 'Y'}]
10个值分为2行,每行5个。 这只是一个示例数据,并且有太多像这样序列化的vales。
我尝试过简单的循环,但我不确定如何将这5个值组合在一起。
mylist=[]
for id in x:
for i in id:
mylist.append(i, id[i])
答案 0 :(得分:2)
首先,我定义了一个生成器,一次将您的列表分成n
项:
def generate_groups(lst, n):
for i in xrange(0, len(lst), n):
yield lst[i:i+n]
然后简单地建立你的词典:
result = []
for group in generate_groups(x, 5):
dct = {}
for item in group:
dct.update(item)
result.append(dct)
那样:
>>> result
[{'bsName': 'AC SLEEPER',
'bsType': 'ACS',
'ischildconcession': 'N',
'isseatlayot': 'N',
'isseatnmber': 'N'},
{'bsName': 'AC-JANRATH',
'bsType': 'JNR',
'ischildconcession': 'N',
'isseatlayot': 'Y',
'isseatnmber': 'Y'}]
答案 1 :(得分:1)
只需使用range
>>> dics = [x[i:i+5] for i in range(0,len(x),5)]
>>> dics
[[{'bsName': 'AC SLEEPER'}, {'bsType': 'ACS'}, {'ischildconcession': 'N'}, {'isseatlayot': 'N'}, {'isseatnmber': 'N'}], [{'bsName': 'AC-JANRATH'}, {'bsType': 'JNR'}, {'ischildconcession': 'N'}, {'isseatlayot': 'Y'}, {'isseatnmber': 'Y'}]]
>>> [{i.keys()[0]:i.values()[0] for i in j} for j in dics]
[{'isseatnmber': 'N', 'bsName': 'AC SLEEPER', 'bsType': 'ACS', 'ischildconcession': 'N', 'isseatlayot': 'N'}, {'isseatnmber': 'Y', 'bsName': 'AC-JANRATH', 'bsType': 'JNR', 'ischildconcession': 'N', 'isseatlayot': 'Y'}]
步骤为5
,因为您要分成5行
答案 2 :(得分:1)
您可以使用itertools
文档和itertools.chain()
中的 grouper
配方将属性分组为可与{一起使用的键/值元组{3}}:
>>> [dict(chain(*[item.items() for item in group])) for group in grouper(x, 5, {})]
[{'isseatnmber': 'N', 'bsName': 'AC SLEEPER', 'bsType': 'ACS', 'ischildconcession': 'N', 'isseatlayot': 'N'},
{'isseatnmber': 'Y', 'bsName': 'AC-JANRATH', 'bsType': 'JNR', 'ischildconcession': 'N', 'isseatlayot': 'Y'}]
dict
constructor文档中的 grouper
食谱允许您将键/值值组分为5组:
>>> from itertools import izip_longest
>>>
>>> def grouper(iterable, n, fillvalue=None):
... "Collect data into fixed-length chunks or blocks"
... # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
... args = [iter(iterable)] * n
... return izip_longest(fillvalue=fillvalue, *args)
...
>>> groups = list(grouper(x, 5, {}))
>>> groups
[({'bsName': 'AC SLEEPER'}, {'bsType': 'ACS'}, {'ischildconcession': 'N'}, {'isseatlayot': 'N'}, {'isseatnmber': 'N'}),
({'bsName': 'AC-JANRATH'}, {'bsType': 'JNR'}, {'ischildconcession': 'N'}, {'isseatlayot': 'Y'}, {'isseatnmber': 'Y'})]
>>>
然后使用列表理解和dict.items()
将单键/值dicts列表转换为键/值元组:
>>> pairs = [[kv.items() for kv in group] for group in groups]
>>> pairs
[[[('bsName', 'AC SLEEPER')], [('bsType', 'ACS')], [('ischildconcession', 'N')], [('isseatlayot', 'N')], [('isseatnmber', 'N')]],
[[('bsName', 'AC-JANRATH')], [('bsType', 'JNR')], [('ischildconcession', 'N')], [('isseatlayot', 'Y')], [('isseatnmber', 'Y')]]]
现在使用 itertools
和itertools.chain()
将对列表展平为适合dict
构造函数的键/值元组列表:
>>> itemgroups = [list(chain(*pair)) for pair in pairs]
>>> itemgroups[0]
[('bsName', 'AC SLEEPER'), ('bsType', 'ACS'), ('ischildconcession', 'N'), ('isseatlayot', 'N'), ('isseatnmber', 'N')]
最后一步,使用 list unpacking 将这些键/值元组对转换为词典:
>>> [dict(items) for items in itemgroups]
[{'isseatnmber': 'N', 'bsName': 'AC SLEEPER', 'bsType': 'ACS', 'ischildconcession': 'N', 'isseatlayot': 'N'},
{'isseatnmber': 'Y', 'bsName': 'AC-JANRATH', 'bsType': 'JNR', 'ischildconcession': 'N', 'isseatlayot': 'Y'}]
注意:只需要所有这些中间list()
调用,因为其中一些函数会生成在迭代一次后将被使用的生成器,否则重新使用结果进行演示互动翻译不会有效。如果将所有这些步骤结合起来,则不需要中间列表。
将所有内容放在一起,没有中间列表:
>>> [dict(chain(*[item.items() for item in group])) for group in grouper(x, 5, {})]
[{'isseatnmber': 'N', 'bsName': 'AC SLEEPER', 'bsType': 'ACS', 'ischildconcession': 'N', 'isseatlayot': 'N'},
{'isseatnmber': 'Y', 'bsName': 'AC-JANRATH', 'bsType': 'JNR', 'ischildconcession': 'N', 'isseatlayot': 'Y'}]