2

2 つの辞書がある場合:

 [{u'id': 217110,
  u'label': u'Business A',
  u'score': 0},
 {u'id': 217111,
  u'label': u'Business B',
  u'score': 0},
 {u'id': 217112,
  u'label': u'Business Yada Yada',
  u'score': 0'}]

[{u'City': u'Damariscotta',
  u'EntityType': u'Maine Public',
  u'EntityTypeCode': u'1',
  u'Status1': u'Open',
  u'ID': u'0188',
  u'Name1': u'A Company 000',
  u'UpdateTimeUnix': 1363756455},
{u'City': u'Santa Barbra',
  u'EntityType': u'California Public',
  u'EntityTypeCode': u'1',
  u'Status1': u'Delayed',
  u'ID': u'1001',
  u'Name1': u'Business A',
  u'UpdateTimeUnix': 1363758764},
{u'City': u'Boise',
  u'EntityType': u'Idaho Public',
  u'EntityTypeCode': u'1',
  u'Status1': u'Closed',
  u'ID': u'1012',
  u'Name1': u'Business Yada Yada',
  u'UpdateTimeUnix': 1363759375},
{u'City': u'Elkhart',
  u'EntityType': u'Indiana Public',
  u'EntityTypeCode': u'1',
  u'Status1': u'Open',
  u'ID': u'1016',
  u'Name1': u'Business B',
  u'UpdateTimeUnix': 1363826341}]

要するに、これを取得する効率的な方法は何ですか?:

 [{u'id': 217110,
  u'label': u'Business A',
  u'score': 0,
  u'Status1': u'Delayed'},
 {u'id': 217111,
  u'label': u'Business B',
  u'score': 0,
  u'Status1': u'Open'},
 {u'id': 217112,
  u'label': u'Business Yada Yada',
  u'score': 0',
  u'Status1': u'Open'}]
4

3 に答える 3

1

operator.itemgetter を使用します。

from operator import itemgetter
key1 = itemgetter("Name1")
key2 = itemgetter("label")
key3 = itemgetter("Status1")
for record in b: # this is the longer list of dicts
    k = key1(record)
    for record2 in a: #this is the shorter one
        if key2(record2) == k:
            record2['Status1'] = key3(record)

print a

出力:

[{u'score': 0, 'Status1': u'Delayed', u'id': 217110, u'label': u'Business A'}, {u'score': 0, 'Status1': u'Open', u'id': 217111, u'label': u'Business B'}, {u'score': 0, 'Status1': u'Closed', u'id': 217112, u'label': u'Business Yada Yada'}]
于 2013-07-26T22:06:23.810 に答える
1

まず、これは宿題のように聞こえます。コメントできるように、質問者が書いたものを投稿することをお勧めします。しかし、あなたはまだ何をしたかを私たちに示していません。

2 つ目は、データの保存方法が推奨されていないことです。キーが小さな固定セットからのものである場合は、オブジェクトごとに一意のキーを持つ辞書で namedtuple を使用することをお勧めします。特に 2 番目のリストでは、名前を見つけるために反復する必要があります。その場合、名前の値がキーになります。参照: http://docs.python.org/2/library/collections.html

第三に、質問は明確にしてください。時間をかけてお手伝いさせていただきますので、お気軽にご相談ください。

第四に、あなたが望むことをするために:

for user in list1:
    for record in list2:
        if not record['Name1'] == user['label']:
            continue
        user['Status1'] = record['Status1']

これは、タスクを完了するための最も簡単で効率的な方法だと思います。すべての操作は、新しいオブジェクトを生成せずにその場で行われます。この場合、オブジェクトにキーがないため、より洗練された検索方法は不可能です(辞書です...)。線形検索は、私たちができる最善の方法です。

于 2013-07-26T23:11:17.780 に答える