遇到一特别的难题

2016-09-23 20:06:23 +08:00
 av1254
将数组字典

t1 = [{'id':1, 'abc':'2'}, {'id':1, 'abc':'3'}, {'id':2, 'abc':'2'}]

t2 = [{'id':1, 'abc':['2','3']}, {'id':2, 'abc':'2'}]


如何将 t1 转换成 t2 呢 ?
请求各位大神支招
3769 次点击
所在节点    Python
22 条回复
cvv
2016-09-23 20:47:39 +08:00
需求不明确,单从你写的例子上看根本不复杂,另外也没说明语言限制

硬要说思路, for*2 、 if 、 merge …
idamien
2016-09-23 21:01:28 +08:00
for for

algorithme
ldbC5uTBj11yaeh5
2016-09-23 21:49:33 +08:00
我知道一个不错技巧来解决这个问题,但是楼主你给的例子故意抹掉的太多信息,所以我偏不告诉你。

比如,{'id':1, 'abc':'2'} 这是个无序字典,没有显而易见的顾虑可以对应目标数组。明显是你抹掉信息了。
ldbC5uTBj11yaeh5
2016-09-23 22:01:01 +08:00
算了,上贴言辞比较激烈,我就给楼主意思一下了,见下图。




我猜楼主会对这个答案不甚满意,谁叫你的题目就如此呢。
moyang
2016-09-23 22:38:05 +08:00
都不说结果要不要 sorted by id ,也不说 input 是不是 sorted by id...
huntzhan
2016-09-23 23:03:29 +08:00
......感觉既不特别也不难呀
billlee
2016-09-24 00:26:26 +08:00
def group(iterable):
   for key, values in itertools.groupby(iterable, lambda x: x['id']):
     yield {'id': key, 'abc': [item['abc'] for item in values]}
Perry
2016-09-24 00:31:45 +08:00
如果 t2 的 abc 都是 array 的话就简单了
flyeblue
2016-09-24 00:56:59 +08:00
楼主的意思应该是那个 id 数量不定, list 的大小不定吧,我琢磨了半天只得一个笨办法:
t1 = [{'id': 1, 'abc': '2'}, {'id': 1, 'abc': '3'}, {'id': 2, 'abc': '2'}]
idmax = len(t1) + 1
aa = idmax*[None, ]
for ll in t1:
ii = ll["id"]
cc = ll["abc"]
if aa[ii]:
temp = aa[ii]
else:
temp = []
temp.append(cc)
aa[ii] = temp[:]
t2 = list()
for ll in range(idmax):
temp = dict()
if aa[ll]:
temp["id"] = ll
temp["abc"] = aa[ll]
t2.append(temp)
print(t2)
Lime
2016-09-24 01:22:24 +08:00
t1 = [{"id": 1, "abc": "2"}, {"id": 1, "abc": "3"}, {"id": 2, "abc": "2"}]

print [{"id": k, "abc": (lambda v: [item["abc"] for item in v] if len(v) > 1 else v[0]["abc"])(list(group))} for k, group in itertools.groupby(t1, lambda item: item["id"])]
Lime
2016-09-24 01:24:48 +08:00
menc
2016-09-24 01:27:29 +08:00
@Lime
这种毫无可读性单纯为了炫技的所谓 pythonic 的代码是最不堪的。不如乖乖一行一行写出来。
ericls
2016-09-24 07:17:18 +08:00
@menc 我觉得这个完全不 pythonic pythonic 需要可读性
av1254
2016-09-24 08:51:00 +08:00
@moyang 我只是想格式转换
av1254
2016-09-24 08:55:08 +08:00
@jigloo 一般都是以无序考虑的吧
av1254
2016-09-24 08:58:16 +08:00
@flyeblue 帅哥,你这方法有点问题
wizardforcel
2016-09-24 11:31:10 +08:00
感觉 t2 很不高效,为什么不是 {1: {'abc': ['2','3']}, 2: {'abc': ['2']}}
Aksura
2016-09-24 11:38:53 +08:00
@billlee 在 groupby 前也许可以先对 iterable 先排个序?
BingoXuan
2016-09-24 12:09:46 +08:00
我会考虑用 pandas 的 from_dict 转换成 DataFrame 。然后进行检索合并。不过如果字典本身就是乱序的话,就要加个正则筛选再按列排序。
bjjvvv
2016-09-24 13:51:20 +08:00
其实可以简化一下
就是 [{1: '2'}, {1: '3'}, {2: '2'}] -> {1: ['2', '3'], 2: ['2']}
https://gist.github.com/bjjvvv/e2db0d7c4e77776e5c0eddb4fc01b73b

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/308543

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX