python - 如何使用 itertools 按名称分组、保留键和名称?

标签 python python-itertools itertools-groupby

我正在使用一个数据集,它是一个简单的 SQL 查询,用于获取所需的行。

[(2, 5, 'JOHN K', 'YAHOO'), (2, 6, 'AARON M', 'YAHOO'), (2, 7, 'NICK C', 'YAHOO'), (1, 2, 'CELESTE G', 'GOOGLE'), (1, 3, 'RICH M', 'GOOGLE'), (1, 4, 'SANDEEP C', 'GOOGLE')]

到目前为止,我所得到的结果是没有键的分组 -

import itertools
import operator


def accumulate(rows):
    # itemgetter fetches and groups them by company name(3)
    it = itertools.groupby(rows, operator.itemgetter(3))
    k = {}
    for key, subiter in it:
        k[key] = ';'.join(item[2] for item in subiter)
    return k


if __name__ == '__main__':

    rows = [(2, 5, 'JOHN K', 'YAHOO'), (2, 6, 'AARON M', 'YAHOO'), (2, 7, 'NICK C', 'YAHOO'), (1, 2, 'CELESTE G', 'GOOGLE'), (1, 3, 'RICH M', 'GOOGLE'), (1, 4, 'SANDEEP C', 'GOOGLE')] 
    groupedby = (accumulate(rows))

    print(groupedby)

输出 -

{'YAHOO': 'JOHN K;AARON M;NICK C', 'GOOGLE': 'CELESTE G;RICH M;SANDEEP C'}

所需输出保留键并仍然进行分组 -

{('YAHOO,2'): '(JOHN K,5);(AARON M,6);(NICK C,7)', ('GOOGLE,1'): '(CELESTE G,2);(RICH M,3);(SANDEEP C,4)'}

我对其他一些不以逗号分隔的数据结构持开放态度,使用管道或可能是元组。

for key, subiter in it:
    k[key, ] = ';'.join(item[2] for item in subiter)

感谢任何帮助!

最佳答案

# 1
ans = {}
for a, b, c, d in arr:
    ans.setdefault("".join(["(", ",".join([d, str(a)]), ")"]), []).\
        append("".join(["(", ",".join([c, str(b)]), ")"]))
{k: ";".join(v) for k, v in ans.items()}
# {'(YAHOO,2)': '(JOHN K,5);(AARON M,6);(NICK C,7)',
#  '(GOOGLE,1)': '(CELESTE G,2);(RICH M,3);(SANDEEP C,4)'}
# 2
ans = {}
for el in arr:
    a, b, c, d = el
    key = "".join(["(", ",".join([d, str(a)]), ")"])
    val = "".join(["(", ",".join([c, str(b)]), ")"])
    if ans.get(key) is None:
        ans[key] = [val]
    else:
        ans[key].append(val)

for k, v in ans.items():
    ans[k] = ";".join(v)

ans
# {'(YAHOO,2)': '(JOHN K,5);(AARON M,6);(NICK C,7)',
#   '(GOOGLE,1)': '(CELESTE G,2);(RICH M,3);(SANDEEP C,4)'}​
# I would just do this
ans = {}
for a, b, c, d in arr:
    ans.setdefault((d, a), []).append((c, b))
ans
# {('YAHOO', 2): [('JOHN K', 5), ('AARON M', 6), ('NICK C', 7)],
#  ('GOOGLE', 1): [('CELESTE G', 2), ('RICH M', 3), ('SANDEEP C', 4)]}
# Data
arr = [(2, 5, 'JOHN K', 'YAHOO'),
       (2, 6, 'AARON M', 'YAHOO'),
       (2, 7, 'NICK C', 'YAHOO'),
       (1, 2, 'CELESTE G', 'GOOGLE'),
       (1, 3, 'RICH M', 'GOOGLE'),
       (1, 4, 'SANDEEP C', 'GOOGLE')]

关于python - 如何使用 itertools 按名称分组、保留键和名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74197303/

相关文章:

python - flask、python、HTML 的错误请求错误,flask.request.form 的异常初始化行为

python - 如何跟踪列表中的所有字符串是否都存在特定字符串?

python 2个带索引的嵌套列表的并集

python - 使用推导式拆分并展平字符串和 None 值的列表

numpy - 涉及非常大的数组的问题

python - 在 iter 上并行化循环

Python itertools.groupby 与具有多个值的字典

python - 阅读带重音的文本 - Python