如何在python中创建两个新的列表?

时间:2014-09-23 03:27:53

标签: python

我正在尝试创建两个新的列表,一个用于颜色,一个用于大小 所以我希望新代码是:

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

2 个答案:

答案 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]