gpt4 book ai didi

python - 我怎样才能将我的Python列表转换为另一种列表格式

转载 作者:行者123 更新时间:2023-11-30 23:46:22 26 4
gpt4 key购买 nike

我有一个包含三个参数的列表,如下所示:-

[(8L, 'Mail Opened', 'Saturday'), (4L, 'Mail Not Opened', 'Saturday'), (2L, 'Mail Not Opened', 'Sunday'), (8L, 'Mail Opened', 'Sunday'), (1L, 'Mail Not Opened', 'Monday'), (12L, 'Mail Opened', 'Monday'), (10L, 'Mail Opened', 'Tuesday'), (4L, 'Mail Not Opened', 'Tuesday'), (14L, 'Mail Opened', 'Wednesday'), (6L, 'Mail Not Opened', 'Wednesday'), (1L, 'Mail Not Opened', 'Thursday'), (19L, 'Mail Opened', 'Thursday'), (28L, 'Mail Opened', 'Friday'), (1L, 'Mail Opened', 'Friday')]

我能得到这样的结果

[("Saturday",8,4)],[("Sunday",8,2)]

这里我根据 DAYNAME 组合了两个元组。我已将“邮件已打开”值放在第一位,将“邮件未打开值”放在第二位。也可能存在仅存在一个值的情况那么列表将如下所示

[("Saturday",0,4)],[("Sunday",8,0)]

请帮助我

最佳答案

您使用tuple作为dict,使用字典(或本例中的defaultdict)会更简单。看看:

from collections import defaultdict

lst = [(8L, 'Mail Opened', 'Saturday'), (4L, 'Mail Not Opened', 'Saturday'), (2L, 'Mail Not Opened', 'Sunday'), (8L, 'Mail Opened', 'Sunday'), (1L, 'Mail Not Opened', 'Monday'), (1L, 'Mail Not Opened', 'Monday'), (12L, 'Mail Opened', 'Monday'), (10L, 'Mail Opened', 'Tuesday'), (4L, 'Mail Not Opened', 'Tuesday'), (14L, 'Mail Opened', 'Wednesday'), (6L, 'Mail Not Opened', 'Wednesday'), (1L, 'Mail Not Opened', 'Thursday'), (19L, 'Mail Opened', 'Thursday'), (28L, 'Mail Opened', 'Friday'), (1L, 'Mail Opened', 'Friday')]

d = {'Mail Opened': defaultdict(list), 'Mail Not Opened': defaultdict(list)}

for num,mail,day in lst:
d[mail][day].append(num)

这会将您的输出分为“邮件已打开”和“邮件未打开”。

DAYNAME 作为键

但我似乎把你的问题搞糊涂了,你想要输出除以 DAYNAME。

在这种情况下,通过一些调整,我们可以恢复字典的嵌套顺序:

from collections import defaultdict

lst = [(8, 'Mail Opened', 'Saturday'), (4, 'Mail Not Opened', 'Saturday'), (2, 'Mail Not Opened', 'Sunday'), (8, 'Mail Opened', 'Sunday'), (1, 'Mail Not Opened', 'Monday'), (1, 'Mail Not Opened', 'Monday'), (12, 'Mail Opened', 'Monday'), (10, 'Mail Opened', 'Tuesday'), (4, 'Mail Not Opened', 'Tuesday'), (14, 'Mail Opened', 'Wednesday'), (6, 'Mail Not Opened', 'Wednesday'), (1, 'Mail Not Opened', 'Thursday'), (19, 'Mail Opened', 'Thursday'), (28, 'Mail Opened', 'Friday'), (1, 'Mail Opened', 'Friday')]


days = defaultdict(lambda : {'Mail Opened': [], 'Mail Not Opened': []})

for num,mail,day in lst:
days[day][mail].append(num)

这将给出这种输出:

for k,v in days.iteritems():
print k, v

"""
Monday {'Mail Not Opened': [1, 1], 'Mail Opened': [12]}
Tuesday {'Mail Not Opened': [4], 'Mail Opened': [10]}
Friday {'Mail Not Opened': [], 'Mail Opened': [28, 1]}
Wednesday {'Mail Not Opened': [6], 'Mail Opened': [14]}
Thursday {'Mail Not Opened': [1], 'Mail Opened': [19]}
Sunday {'Mail Not Opened': [2], 'Mail Opened': [8]}
Saturday {'Mail Not Opened': [4], 'Mail Opened': [8]}
"""

这种方法将以完全相同的方式处理每种情况,因此如果您可以重构代码,我强烈建议您采用这种方法。

特殊情况:

在您的评论中,我发现您说您想要为 ('Friday', 'Mail Opened', ..) 提供 2 个不同的输出,例如:

[('Friday', 1L, 0), ('Friday', 28L, 0)]

而不是把它们拴在一起。这种特殊情况对您来说真的有意义吗?这是一个要求吗?如果答案是肯定的,请更新您的问题。

您还说过,您不会期望超过两个等于 DAYNAME,但在您的示例中,有 3 个 Monday,其中两个看起来很相似,所以可能是一个拼写错误(如果是,请更新你的问题)。
但如果这是一个拼写错误,您确定双星期五条目不是一个拼写错误吗?

无论如何,删除“额外”星期一,并假设您确实需要这种输出(出于某些兼容性 API 的原因,也许),你可以这样做:

lst = [(8, 'Mail Opened', 'Saturday'), (4, 'Mail Not Opened', 'Saturday'), (2, 'Mail Not Opened', 'Sunday'), (8, 'Mail Opened', 'Sunday'), (1, 'Mail Not Opened', 'Monday'), (12, 'Mail Opened', 'Monday'), (10, 'Mail Opened', 'Tuesday'), (4, 'Mail Not Opened', 'Tuesday'), (14, 'Mail Opened', 'Wednesday'), (6, 'Mail Not Opened', 'Wednesday'), (1, 'Mail Not Opened', 'Thursday'), (19, 'Mail Opened', 'Thursday'), (28, 'Mail Opened', 'Friday'), (1, 'Mail Opened', 'Friday')]

pos = {'Mail Opened': 1, 'Mail Not Opened': 2}
results = []

for num,mail,day in lst:
found = False
for x in results:
if day == x[0]:
found = True
if x[pos[mail]] == 0:
x[pos[mail]] = num
else: # this will handle your special case
new = [day, 0, 0]
new[pos[mail]] = num
results.append(new)
break

if not found:
new = [day, 0, 0]
new[pos[mail]] = num
results.append(new)

这将为您提供以下输出:

for r in results:
print r

"""
['Saturday', 8, 4]
['Sunday', 8, 2]
['Monday', 12, 1]
['Tuesday', 10, 4]
['Wednesday', 14, 6]
['Thursday', 19, 1]
['Friday', 28, 0]
['Friday', 1, 0]
"""

注释:

  1. 最后一个解决方案并不关心您有多少个“星期五”(或任何 DAYNAME)条目。旧条目不会被覆盖,并且将创建新条目。
    但请注意,如果您确实有两个以上的“星期五”,您的输出将在逻辑上不一致并且是伪随机的!这是一个设计失败,因此我不建议您使用最后一种方法。
  2. 从您在评论中显示的错误(关于此答案和另一个答案)来看,您似乎正在隐藏内置列表。这意味着在代码中的某个时刻,您会执行以下操作:

    list = # something

    不要这样做,请使用其他名称,例如 lst

关于python - 我怎样才能将我的Python列表转换为另一种列表格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9077304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com