如何使用 'zip()' 循环列表并向元组列表中的每个元组添加一个项目?
How to cycle through a list and add one item to each tuple in a list of tuples using 'zip()'?
我的数据文件有八千行,每一行都是一个元组。前两行是:
(2000, 1, 1, 1, 336)
(2000, 1, 1, 2, 335)
我想重复循环工作日并将工作日附加到每个数据元组。行列表应如下所示:
[(2000, 1, 1, 1, 336, 'Sat'), (2000, 1, 1, 2, 335, 'Sun'), ...]
我尝试了不同的方法,并设法获得了几乎所有可能的组合,除了所需的组合。我无法完全理解我误解了什么。
代码
weekdays = ['Sat','Sun','Mon','Tue','Wed','Thu','Fri']
a = read_file('VIK_sealevel_2000.txt')
zipp = list(zip(a, weekdays))
print(zipp[0:2])
输出
[((2000, 1, 1, 1, 335), 'Sat'), ((2000, 1, 1, 2, 336), 'Sun')]
要将工作日添加到每个元组中,请尝试使用:
a = [(2000, 1, 1, 1, 335), (2000, 1, 1, 2, 336)] # was read_file('VIK_sealevel_2000.txt')
weekdays = ['Sat','Sun','Mon','Tue','Wed','Thu','Fri']
zipp = [row[0] + (row[1],) for row in zip(a, weekdays)]
更新:
正如 Christopher Peisert 在 中指出的那样,当 a
中的行数多于 weekdays
中时,此答案不正确
第一个问题是如何高效地循环工作日。一个干净的解决方案是使用 itertools.cycle()
.
以下将生成无限重复的工作日序列。
import itertools
weekdays = ['Sat','Sun','Mon','Tue','Wed','Thu','Fri']
itertools.cycle(weekdays)
zip()
函数将在最短输入迭代器耗尽时停止。现在我们有一个无限的工作日序列,最短的输入将是八千行数据。
>>> import itertools
>>> weekdays = ['Sat','Sun','Mon','Tue','Wed','Thu','Fri']
>>> data = [(2000, 1, 1, 1, 336), (2000, 1, 1, 2, 335), (2000, 1, 1, 1, 334),
(2000, 1, 1, 2, 333), (2000, 1, 1, 1, 332), (2000, 1, 1, 2, 331),
(2000, 1, 1, 1, 330), (2000, 1, 1, 2, 329), (2000, 1, 1, 1, 328),
(2000, 1, 1, 2, 327)]
>>> list(zip(data, itertools.cycle(weekdays)))
[((2000, 1, 1, 1, 336), 'Sat'), ((2000, 1, 1, 2, 335), 'Sun'),
((2000, 1, 1, 1, 334), 'Mon'), ((2000, 1, 1, 2, 333), 'Tue'),
((2000, 1, 1, 1, 332), 'Wed'), ((2000, 1, 1, 2, 331), 'Thu'),
((2000, 1, 1, 1, 330), 'Fri'), ((2000, 1, 1, 2, 329), 'Sat'),
((2000, 1, 1, 1, 328), 'Sun'), ((2000, 1, 1, 2, 327), 'Mon')]
最后,为了在内部元组中获取工作日,我们可以在列表理解中创建新的元组。
>>> [t + (day,) for t, day in zip(data, itertools.cycle(weekdays))]
[(2000, 1, 1, 1, 336, 'Sat'), (2000, 1, 1, 2, 335, 'Sun'),
(2000, 1, 1, 1, 334, 'Mon'), (2000, 1, 1, 2, 333, 'Tue'),
(2000, 1, 1, 1, 332, 'Wed'), (2000, 1, 1, 2, 331, 'Thu'),
(2000, 1, 1, 1, 330, 'Fri'), (2000, 1, 1, 2, 329, 'Sat'),
(2000, 1, 1, 1, 328, 'Sun'), (2000, 1, 1, 2, 327, 'Mon')]
这里,t
是与每一行数据关联的元组,day
是工作日,语法t + (day,)
创建一个新的元组,由数据元组与工作日。
我的数据文件有八千行,每一行都是一个元组。前两行是:
(2000, 1, 1, 1, 336)
(2000, 1, 1, 2, 335)
我想重复循环工作日并将工作日附加到每个数据元组。行列表应如下所示:
[(2000, 1, 1, 1, 336, 'Sat'), (2000, 1, 1, 2, 335, 'Sun'), ...]
我尝试了不同的方法,并设法获得了几乎所有可能的组合,除了所需的组合。我无法完全理解我误解了什么。
代码
weekdays = ['Sat','Sun','Mon','Tue','Wed','Thu','Fri']
a = read_file('VIK_sealevel_2000.txt')
zipp = list(zip(a, weekdays))
print(zipp[0:2])
输出
[((2000, 1, 1, 1, 335), 'Sat'), ((2000, 1, 1, 2, 336), 'Sun')]
要将工作日添加到每个元组中,请尝试使用:
a = [(2000, 1, 1, 1, 335), (2000, 1, 1, 2, 336)] # was read_file('VIK_sealevel_2000.txt')
weekdays = ['Sat','Sun','Mon','Tue','Wed','Thu','Fri']
zipp = [row[0] + (row[1],) for row in zip(a, weekdays)]
更新:
正如 Christopher Peisert 在 a
中的行数多于 weekdays
第一个问题是如何高效地循环工作日。一个干净的解决方案是使用 itertools.cycle()
.
以下将生成无限重复的工作日序列。
import itertools
weekdays = ['Sat','Sun','Mon','Tue','Wed','Thu','Fri']
itertools.cycle(weekdays)
zip()
函数将在最短输入迭代器耗尽时停止。现在我们有一个无限的工作日序列,最短的输入将是八千行数据。
>>> import itertools
>>> weekdays = ['Sat','Sun','Mon','Tue','Wed','Thu','Fri']
>>> data = [(2000, 1, 1, 1, 336), (2000, 1, 1, 2, 335), (2000, 1, 1, 1, 334),
(2000, 1, 1, 2, 333), (2000, 1, 1, 1, 332), (2000, 1, 1, 2, 331),
(2000, 1, 1, 1, 330), (2000, 1, 1, 2, 329), (2000, 1, 1, 1, 328),
(2000, 1, 1, 2, 327)]
>>> list(zip(data, itertools.cycle(weekdays)))
[((2000, 1, 1, 1, 336), 'Sat'), ((2000, 1, 1, 2, 335), 'Sun'),
((2000, 1, 1, 1, 334), 'Mon'), ((2000, 1, 1, 2, 333), 'Tue'),
((2000, 1, 1, 1, 332), 'Wed'), ((2000, 1, 1, 2, 331), 'Thu'),
((2000, 1, 1, 1, 330), 'Fri'), ((2000, 1, 1, 2, 329), 'Sat'),
((2000, 1, 1, 1, 328), 'Sun'), ((2000, 1, 1, 2, 327), 'Mon')]
最后,为了在内部元组中获取工作日,我们可以在列表理解中创建新的元组。
>>> [t + (day,) for t, day in zip(data, itertools.cycle(weekdays))]
[(2000, 1, 1, 1, 336, 'Sat'), (2000, 1, 1, 2, 335, 'Sun'),
(2000, 1, 1, 1, 334, 'Mon'), (2000, 1, 1, 2, 333, 'Tue'),
(2000, 1, 1, 1, 332, 'Wed'), (2000, 1, 1, 2, 331, 'Thu'),
(2000, 1, 1, 1, 330, 'Fri'), (2000, 1, 1, 2, 329, 'Sat'),
(2000, 1, 1, 1, 328, 'Sun'), (2000, 1, 1, 2, 327, 'Mon')]
这里,t
是与每一行数据关联的元组,day
是工作日,语法t + (day,)
创建一个新的元组,由数据元组与工作日。