当条件为真时,如何在列表中添加值?

时间:2017-11-16 09:21:41

标签: python list dictionary

我有很多项目的词典:

{'id-quantity-60': u'1', 'id-quantity-35': u'3','id-product-35': u'on', 'id-product-60': u'on',}

我需要创建一个包含所有三个元素的列表。 我期待这样的列表:

<type 'list'>: [['60', u'1', u'on'], ['35', u'3', u'on'],]

我上面只有2个值,但是相同product-id的2倍。因此,它应该添加数量和关闭&#39;一起到相同的产品ID。

我该怎么做?我尝试过这样的事情:

for key, value in request.params.items():
  if key[:12] == 'id-quantity-':
    if key[12:] in list:
      list.insert(key[12:], value)
    else:
      list.append([key[12:], value])

  if key[:11] == 'id-product-':
    if key[11:] in list:
      list.insert(key[11:], value)
    else:
      list.append([key[11:], value])

问题是我得到这个列表所有时间分裂:

<type 'list'>: [['60', u'1'], ['35', u'3'], ['35', u'on'], ['60', u'on'],]

最后我应该能够在这里填充数据( 60,1,True for 示例):

data = request.registry['website']._subscription_exclude_product(cr, uid, [{'product_id': int(60), 'qty': int(1), 'like': bool(True)}], context=context)

非常感谢。

4 个答案:

答案 0 :(得分:0)

假设数量和产品的密钥在字典中的格式相同:

d={'id-quantity-60': u'1', 'id-quantity-35': u'3','id-product-35': u'on', 'id-product-60': u'on',}

l=[]
for k,v in d.items():
    if 'id-quantity' in k:
        x = k.replace('id-quantity-','')
        y = 'id-product-'+str(x)
        l.append([x, v, d[y]])

print(l)

输出

[['60', '1', 'on'], ['35', '3', 'on']]

答案 1 :(得分:0)

假设您的输入字典位于request.params变量中,

<?xml version='1.0' encoding='utf-8'?>
<siteinfo>
    <page>
        **#some how this <title /> remains**
        ***<title />***
        <text>Bar</text>
    </page>
    <page>
        <title>NotFoo</title>
        <text>NotBar</text>
    </page>
</siteinfo>

输出:

quantity = {k.split("-")[-1]: v for k, v in request.params.items() if "quantity" in k}
product = {k.split("-")[-1]: v for k, v in request.params.items() if "product" in k}

result = [[k, v, product[k]]  for k, v in quantity.items()]

print(result)

更新:使用以下

替换[['60', '1', 'on'], ['35', '3', 'on']]
result=...

获取

result = [[k, v, True if product.get(k) else False]  for k, v in quantity.items()]

如果&#34; id-product-42&#34;不在输入词典中。

答案 2 :(得分:0)

这是你期望的吗?

products = {k.split('-')[-1]: v for k, v in x.items() if 'product' in k}
quantities = {k.split('-')[-1]: v for k, v in x.items() if 'quantity' in k}
all = [(k, v, 'on' if k in products else 'off') for k, v in quantities.items()]

答案 3 :(得分:0)

您可以将defaultdict()与默认的2个项目列表一起使用,以使其更加灵活:

from collections import defaultdict

def default_list():
    return [None, None]

request = {'id-quantity-60': u'1', 'id-quantity-71': u'0', 'id-quantity-35': u'3','id-product-35': u'on', 'id-product-60': u'on'}
result = defaultdict(default_list)

for key, value in request.items():
  _, pattern, productid = key.split('-')

  if pattern == 'quantity':
    result[productid][0] = value
    result[productid][1] = 'on' if int(value) else 'off'
  elif pattern == 'product':
    result[productid][1] = value

返回:

defaultdict(<function default_list at 0x7faa3d3efe18>,
            {'35': ['3', 'on'],
             '60': ['1', 'on'],
             '71': ['0', 'off']})

如果你真的需要一个清单:

resultList = [[k]+v for (k,v) in result.items()]
>>> [['60', '1', 'on'], ['71', '0', 'off'], ['35', '3', 'on']]