V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
av1254
V2EX  ›  Python

遇到一特别的难题

  •  
  •   av1254 · 2016-09-23 20:06:23 +08:00 · 3940 次点击
    这是一个创建于 3013 天前的主题,其中的信息可能已经有所发展或是发生改变。
    将数组字典

    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 呢 ?
    请求各位大神支招
    22 条回复    2016-09-26 06:47:03 +08:00
    cvv
        1
    cvv  
       2016-09-23 20:47:39 +08:00
    需求不明确,单从你写的例子上看根本不复杂,另外也没说明语言限制

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

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

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




    我猜楼主会对这个答案不甚满意,谁叫你的题目就如此呢。
    moyang
        5
    moyang  
       2016-09-23 22:38:05 +08:00
    都不说结果要不要 sorted by id ,也不说 input 是不是 sorted by id...
    huntzhan
        6
    huntzhan  
       2016-09-23 23:03:29 +08:00
    ......感觉既不特别也不难呀
    billlee
        7
    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
        8
    Perry  
       2016-09-24 00:31:45 +08:00 via iPhone
    如果 t2 的 abc 都是 array 的话就简单了
    flyeblue
        9
    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
        10
    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
        11
    Lime  
       2016-09-24 01:24:48 +08:00
    menc
        12
    menc  
       2016-09-24 01:27:29 +08:00
    @Lime
    这种毫无可读性单纯为了炫技的所谓 pythonic 的代码是最不堪的。不如乖乖一行一行写出来。
    ericls
        13
    ericls  
       2016-09-24 07:17:18 +08:00 via iPhone
    @menc 我觉得这个完全不 pythonic pythonic 需要可读性
    av1254
        14
    av1254  
    OP
       2016-09-24 08:51:00 +08:00
    @moyang 我只是想格式转换
    av1254
        15
    av1254  
    OP
       2016-09-24 08:55:08 +08:00
    @jigloo 一般都是以无序考虑的吧
    av1254
        16
    av1254  
    OP
       2016-09-24 08:58:16 +08:00
    @flyeblue 帅哥,你这方法有点问题
    wizardforcel
        17
    wizardforcel  
       2016-09-24 11:31:10 +08:00
    感觉 t2 很不高效,为什么不是 {1: {'abc': ['2','3']}, 2: {'abc': ['2']}}
    Aksura
        18
    Aksura  
       2016-09-24 11:38:53 +08:00
    @billlee 在 groupby 前也许可以先对 iterable 先排个序?
    BingoXuan
        19
    BingoXuan  
       2016-09-24 12:09:46 +08:00
    我会考虑用 pandas 的 from_dict 转换成 DataFrame 。然后进行检索合并。不过如果字典本身就是乱序的话,就要加个正则筛选再按列排序。
    bjjvvv
        20
    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
    wuxc
        21
    wuxc  
       2016-09-25 19:14:51 +08:00
    辅助字典纪录 id 在第二个 array 中的 index 。
    需要排序的话转换完排就行。
    wnduan
        22
    wnduan  
       2016-09-26 06:47:03 +08:00
    也是初学 Python ,很多库、函数、方法都不熟。搞个直观暴力的方法试试。
    https://gist.github.com/wnduan/892c4b3abc5a33abcc2351ba1bd1f997
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1140 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:31 · PVG 02:31 · LAX 10:31 · JFK 13:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.