将相似的值组合在一起

时间:2015-04-02 13:31:25

标签: python

我有一个包含多个记录的字符串,每个记录都有自己的字符串。

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])

3 个答案:

答案 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'}]