3

次のような行列があるとします

[['ID', 'fName', 'lName'],
['A101', 'Mark', 'Smith'],
['A102', 'Jane', 'Smith'],
['A103', 'Mark', 'Twain'],
['A104', 'Ann', 'Lee']]

一部のセルは「」であることに注意してください

私がする必要があるのは、このマトリックスから 2 つの辞書を作成することです。

  1. ID をキーとして使用し、fname と lname をその値として使用します
  2. lName をキーとして使用し、ID と fName を値として使用します

各リストを取得し(マトリックスはリストのリストであるため)、それを使用して追加として辞書に渡すのと同じくらい簡単だと思っていましたが、その部分を書くのに苦労しています。

たとえば、マトリックスを反復して識別子としてfor i in xrange (0, len(matrix))使用するには、これが正しいかどうか、およびこれらの辞書を作成する正しい方法が何であるかはわかりません。imatrix[i]

私はPython 2.7.2を持っています

4

3 に答える 3

8
>>> dict((x[0], (x[1], x[2])) for x in names[1:])
{'A104': ('Ann', 'Lee'), 'A102': ('Jane', 'Smith'), 'A103': ('Mark', 'Twain'), 'A101': ('Mark', 'Smith')}
>>> dict((x[2], (x[0], x[1])) for x in names[1:])
{'Twain': ('A103', 'Mark'), 'Smith': ('A102', 'Jane'), 'Lee': ('A104', 'Ann')}
于 2012-10-22T05:49:18.553 に答える
2

Python 2.7以降では、dict内包表記(リスト内包表記に似ています)を使用して同じことを行うことができます。

>>> {ID: (fname, lname) for (ID, fname, lname) in names[1:]}
{'A104': ('Ann', 'Lee'), 'A102': ('Jane', 'Smith'), 'A103': ('Mark', 'Twain'), 'A101': ('Mark', 'Smith')}
>>> {lname: (ID, fname) for (ID, fname, lname) in names[1:]}
{'Twain': ('A103', 'Mark'), 'Smith': ('A102', 'Jane'), 'Lee': ('A104', 'Ann')}

キーが重複している場合、式の最後のキーが他のすべてのキーを上書きすることに注意してください(ここでは、「Smith」のエントリの1つが欠落しています)。この問題を修正する1つの方法は、を使用してdefaultdict、dict値を個々のエントリではなくエントリのリストにすることです。

>>> from collections import defaultdict
>>> by_lastname = defaultdict(list)
>>> for (ID, fname, lname) in names[1:]:
...     by_lastname[lname].append((ID, fname))
... 
>>> by_lastname
defaultdict(<type 'list'>, {'Twain': [('A103', 'Mark')], 'Smith': [('A101', 'Mark'), ('A102', 'Jane')], 'Lee': [('A104', 'Ann')]})
>>> 
于 2012-10-22T06:03:41.723 に答える