1

私はこのコードを持っています:

from BeautifulSoup import BeautifulSoup

TABLE_CONTENT = [['958','<a id="958F" href="javascript:c_row(\'958\')" title="go to map"><img src="/images/c_map.png" border="0"></a>','USA','Atmospheric','<a href="javascript:c_ol(\'958\')" title="click date time to show origin_list (evid=958)">1945/07/16 11:29:45</a>','33.6753','-106.4747','','-.03','21','','','TRINITY','&nbsp;','&nbsp;','<a href="javascript:c_md(\'958\')" title="click here to show source data">SourceData</a>','&nbsp;'],['959','<a id="959F" href="javascript:c_row(\'959\')" title="go to map"><img src="/images/c_map.png" border="0"></a>','USA','Atmospheric','<a href="javascript:c_ol(\'959\')" title="click date time to show origin_list (evid=959)">1945/08/05 23:16:02</a>','34.395','132.4538','','-.58','15','','','LITTLEBOY','&nbsp;','&nbsp;','<a href="javascript:c_md(\'959\')" title="click here to show source data">SourceData</a>','&nbsp;']]

EVENT_LIST = []
for EVENT in TABLE_CONTENT:
    events = {}
    for index, item in enumerate(EVENT):
        if index == 0:
            events['id'] = item
        if index == 4:
            soup = BeautifulSoup(item)
            for a in soup.findAll('a'):
                events['date'] = ''.join(a.findAll(text=True))
        if index == 2:
            events['country'] = item
        if index == 3:
            events['type'] = item
        if index == 5:
            events['lat'] = item
        if index == 6:
            events['lon'] = item
        if index == 8:
            events['depth'] = item
        if index == 9:
            events['yield'] = item
        if index == 12:
            events['name'] = item
    sorted(events, key=lambda key: events['id'])
    EVENT_LIST.append(events)
    print '=== new record ==='
EVENT_LIST.sort(key=lambda x: x['id'])
print EVENT_LIST

最初の問題は、EVENT_LIST 内で辞書オブジェクトがリストに追加された順序と同じでないことです。たとえば、結果を印刷するときの「lat」と「lon」が順序どおりではありません

[{'name': 'TRINITY', 'country': 'USA', 'lon': '-106.4747', 'yield': '21', 'lat': '33.6753', 'depth': '-.03', 'date': u'1945/07/16 11:29:45', 'type': 'Atmospheric', 'id': '958'}, {'name': 'LITTLEBOY', 'country': 'USA', 'lon': '132.4538', 'yield': '15', 'lat': '34.395', 'depth': '-.58', 'date': u'1945/08/05 23:16:02', 'type': 'Atmospheric', 'id': '959'}]

また、このコードを記述するより良い方法はありますか?

4

5 に答える 5

1

https://stackoverflow.com/a/526131/735204

辞書は、ハッシュ テーブルとして内部的に保存されるため、定義上、順序付けされていません。順序付けの欠如は、キーが挿入され、ハッシュ テーブルから削除されるアルゴリズムの結果です。したがって、ディクショナリのキーが特定の順序になっていることに依存するべきではありません。代わりにタプルを使用するか、辞書のリストを使用することを検討してください。後者を使用すると、信頼できる順序付けを保証しながら、key:value 形式を維持できます。

本当に辞書を使用することに設定されている場合は、OrderedDict も確認することをお勧めしますが、dict を使用していて順序付けが必要な場合は、データについて間違った方法で考えている可能性があります。それを行うより簡単な方法。http://docs.python.org/library/collections.html#collections.OrderedDict

好奇心旺盛な方のために、これは Python 辞書の順序が定義されていない理由を正確に説明する素晴らしいプレゼンテーションですhttp://blip.tv/pycon-us-videos-2009-2010-2011/pycon-2010-the-mighty-dictionary- 55-3352147

于 2012-08-21T17:12:16.537 に答える
0

変換のためのより良いコード:

from BeautifulSoup import BeautifulSoup

HEADERS = ['id', None, 'country', 'type', 'date', 'lat', 'lon', None, 'depth', 'yield', None, None, 'name']
TABLE_CONTENT = [['958','<a id="958F" href="javascript:c_row(\'958\')" title="go to map"><img src="/images/c_map.png" border="0"></a>','USA','Atmospheric','<a href="javascript:c_ol(\'958\')" title="click date time to show origin_list (evid=958)">1945/07/16 11:29:45</a>','33.6753','-106.4747','','-.03','21','','','TRINITY','&nbsp;','&nbsp;','<a href="javascript:c_md(\'958\')" title="click here to show source data">SourceData</a>','&nbsp;'],['959','<a id="959F" href="javascript:c_row(\'959\')" title="go to map"><img src="/images/c_map.png" border="0"></a>','USA','Atmospheric','<a href="javascript:c_ol(\'959\')" title="click date time to show origin_list (evid=959)">1945/08/05 23:16:02</a>','34.395','132.4538','','-.58','15','','','LITTLEBOY','&nbsp;','&nbsp;','<a href="javascript:c_md(\'959\')" title="click here to show source data">SourceData</a>','&nbsp;']]

EVENT_LIST = []
for EVENT in TABLE_CONTENT:
    events = {}
    for index, item in enumerate(EVENT):
        if index != 4:
            events[HEADERS[index]] = item
        if index == 4:
            soup = BeautifulSoup(item)
            for a in soup.findAll('a'):
                events[HEADERS[index]] = ''.join(a.findAll(text=True))
    sorted(events, key=lambda key: events['id'])
    EVENT_LIST.append(events)
    print '=== new record ==='
EVENT_LIST.sort(key=lambda x: x['id'])
print EVENT_LIST
于 2012-08-21T17:17:11.627 に答える
0

コードに関する最初のコメント:

  1. eventsループ内にある場合、なぜそれを呼び出すのですか? 1つだけですevent
  2. events別のイベントに変数を再利用するのはなぜですか? たとえば、アイテムがないなど、イベントの形式が悪い場合は危険です。
  3. sortedあなたのコードではノーオペレーションであり、副作用はありません
  4. 非定数変数に CAPITAL を使用するのはなぜですか?

ディクショナリの問題は実際の問題ではなく、機能です。キーdictはハッシュベースであるため、ハッシュによって順序付けられます。本当に順序を保存する必要がある場合は、使用できますcollections.OrderedDict

ちなみに、ここに例があります:

import operator

event_list = []
for event in TABLE_CONTENT:
    event_dict = {}
    event_dict['id'] = event[0]
    event_dict['country'] = event[2]
    # ...
    event_dict['name'] = event[12]
    event_list.append(event_dict)
event_list = sorted(event_list, key = operator.itemgetter('id'))
print event_list
于 2012-08-21T17:24:01.873 に答える