python foreach循环和词典

时间:2013-09-25 07:09:37

标签: python python-2.7

我正在用python弄湿我的脚。我有一个问题。我有一个数组和一个字典,我试图匹配它们之间的数据。我来自php背景,所以当我尝试学习python时,我可能会得到错误的术语。所以我们走了。

product = [{'id': 57L, 'product_name': '3-Piece Reversible Bonded Leather Match Sofa Set in Cream'}, {'id': 58L, 'product_name': '3-Piece Sage Microfiber Sectional Sofa Set with Faux Leather Ottoman'}, {'id': 663L, 'product_name': 'Recycled Plastic Adirondack Tete-a-tete'}, {'id': 717L, 'product_name': 'Designer 20-Bottle Wine Cabinet'}]

然后我将json文件加载到字典中,就像这样

productsChecked = json.loads(open('/Library/WebServer/Documents/scrapper/test2.json').read())
如果我打印

并循环使用productsChecked给我这样的东西

{u'price': u'$399.00', u'product_name': u'Glendale Brown PU Leather Ottoman with Pull-out Guest Bed', u'availability': u'In Stock'}

所以我现在有了这个

productsChecked = json.loads(open('/Library/WebServer/Documents/scrapper/test2.json').read())
for key, value in enumerate(productsChecked):
    for v in value.iteritems():
        print v

所以这给了我这个

(u'price', u'$93.00')
(u'product_name', u'Espresso Hand-Woven Cane Panel 2-Door Wall-Hanging Bathroom Cabinet')
(u'availability', u'In Stock')

我不确定这意味着什么...我想从上面获取product_name并希望将它与第一个产品数组中的product_name进行比较,如果json / dictionary中的product_name与产品数组中的product_name匹配,那么我想打印出匹配的product_name,但现在我不知道从哪里开始

1 个答案:

答案 0 :(得分:4)

productsChecked只是一个词典列表,因此您可以直接访问product_name密钥

productsChecked = json.load(open('/Library/WebServer/Documents/scrapper/test2.json'))

print productsChecked[0]['product_name']

您可以检查products中的任何项目是否与any()匹配:

for check_product in productsChecked:
    if any(p['product_name'] == check_product['product_name'] for p in product):
        # match!

或者您可以使用循环搜索匹配的产品:

for check_product in productsChecked:
    for prod in product:
        if prod['product_name'] == check_product['product_name']:
            print 'Match:', prod

匹配多个product条目,为您提供匹配的字典。

这一切都变得低效快速;你循环遍历两个列表,创建N * M循环。您可以通过将初始product列表转换为字典来减少这种情况,以便进行快速O(1)恒定时间查找:

products_map = {p['product_name']: p for p in product}

这确实假设产品名称是唯一的。

现在您可以直接查找产品名称:

for check_product in productsChecked:
    if check_product['product_name'] in products_map:
        # the named product is in our map