我正在尝试创建两个新的列表,一个用于颜色,一个用于大小 所以我希望新代码是:
resp["colors"] = ["Teal Combo", "Teal Combo"]
resp["sizes"] = ["s","s"]
到目前为止,没有骰子。
resp = {}
resp["color"] = ['Color:', 'Teal Combo', 'Size:', 'S', 'Color:', 'Teal Combo', 'Size:', 'S']
for i, s in enumerate(resp["color"]):
colors = []
sizes = []
print i , s
if s.lower() == 'Color:' and len(resp["color"]) > i+2:
colors.append(resp["color"][i+1])
sizes.append(resp["color"][i+2])
resp["colors"] = colors
resp["sizes"] = sizes
答案 0 :(得分:0)
data = resp["color"]
i = 0
colors = []
sizes = []
while i<len(data)-1:
d = data[i]
if d.startwith("Color"):
colors.append(data[i+1])
i += 1
elif d.startwith("Size"):
sizes.append(data[i+1])
i += 1
i += 1
resp['color'] = colors
resp['size'] = sizes
答案 1 :(得分:0)
有几种不同的方法可以将可迭代的交替值转换为可迭代的对。
在你的情况下,你正在使用序列(列表),所以我们可以通过切片和压缩来实现:
color = resp['color']
pairs = zip(color[::2], color[1::2])
::2
表示“从开始处开始,结束时结束,并选择每个第2个元素”,而1::2
表示相同但从元素1开始而不是从开始
如果你想使用任意的迭代,你可以这样做:
color = resp['color']
icolor = iter(color)
pairs = zip(icolor, icolor)
这是itertools
文档或第三方grouper
库的食谱第二部分中更一般的more-itertools
函数的特例:
pairs = more_itertools.grouper(resp['color'], 2)
如果您想了解how grouper works,请点击该链接。
但是你这样做,你最终会得到像这样的对:
>>> print(list(zip(color[::2], color[1::2]))
[('Color:', 'Teal Combo'),
('Size:', 'S'),
('Color:', 'Teal Combo'),
('Size:', 'S')]
一旦你拥有这些配对,这应该很容易:
resp['colors'] = []
resp['sizes'] = []
for name, value in pairs:
if name == 'Color:':
resp['colors'].append(value)
elif name == 'Size:':
resp['sizes'].append(value)
或者,如果你想更普遍地这样做:
result = collections.defaultdict(list)
for name, value in pairs:
result[name].append(value)
resp['colors'] = result['Color:']
resp['sizes'] = result['Size:']
甚至:
result = collections.defaultdict(list)
for name, value in pairs:
name = name.rstrip(':').lower() + 's'
result[name].append(value)
resp.update[result]