Hướng dẫn nested dictionary lookup python - python tra cứu từ điển lồng nhau

Tôi có 2 tệp CSV: 'Dữ liệu' và 'ánh xạ':

  • Tệp 'ánh xạ' có 4 cột:
    >>> import collections
    >>> d = collections.defaultdict(dict)
    >>> d['dict1']['innerkey'] = 'value'
    >>> d  # currently a defaultdict type
    defaultdict(, {'dict1': {'innerkey': 'value'}})
    >>> dict(d)  # but is exactly like a normal dictionary.
    {'dict1': {'innerkey': 'value'}}
    
    0,
    >>> import collections
    >>> d = collections.defaultdict(dict)
    >>> d['dict1']['innerkey'] = 'value'
    >>> d  # currently a defaultdict type
    defaultdict(, {'dict1': {'innerkey': 'value'}})
    >>> dict(d)  # but is exactly like a normal dictionary.
    {'dict1': {'innerkey': 'value'}}
    
    1,
    >>> import collections
    >>> d = collections.defaultdict(dict)
    >>> d['dict1']['innerkey'] = 'value'
    >>> d  # currently a defaultdict type
    defaultdict(, {'dict1': {'innerkey': 'value'}})
    >>> dict(d)  # but is exactly like a normal dictionary.
    {'dict1': {'innerkey': 'value'}}
    
    2 và
    >>> import collections
    >>> d = collections.defaultdict(dict)
    >>> d['dict1']['innerkey'] = 'value'
    >>> d  # currently a defaultdict type
    defaultdict(, {'dict1': {'innerkey': 'value'}})
    >>> dict(d)  # but is exactly like a normal dictionary.
    {'dict1': {'innerkey': 'value'}}
    
    3. Tất cả bốn cột được điền.
  • Tệp 'Data' có cùng các cột này, với cột
    >>> import collections
    >>> d = collections.defaultdict(dict)
    >>> d['dict1']['innerkey'] = 'value'
    >>> d  # currently a defaultdict type
    defaultdict(, {'dict1': {'innerkey': 'value'}})
    >>> dict(d)  # but is exactly like a normal dictionary.
    {'dict1': {'innerkey': 'value'}}
    
    0 được điền và ba cột khác trống.
  • Tôi muốn mã Python của mình mở cả hai tệp và cho mỗi
    >>> import collections
    >>> d = collections.defaultdict(dict)
    >>> d['dict1']['innerkey'] = 'value'
    >>> d  # currently a defaultdict type
    defaultdict(, {'dict1': {'innerkey': 'value'}})
    >>> dict(d)  # but is exactly like a normal dictionary.
    {'dict1': {'innerkey': 'value'}}
    
    0 trong tệp dữ liệu, hãy ánh xạ giá trị
    >>> import collections
    >>> d = collections.defaultdict(dict)
    >>> d['dict1']['innerkey'] = 'value'
    >>> d  # currently a defaultdict type
    defaultdict(, {'dict1': {'innerkey': 'value'}})
    >>> dict(d)  # but is exactly like a normal dictionary.
    {'dict1': {'innerkey': 'value'}}
    
    1,
    >>> import collections
    >>> d = collections.defaultdict(dict)
    >>> d['dict1']['innerkey'] = 'value'
    >>> d  # currently a defaultdict type
    defaultdict(, {'dict1': {'innerkey': 'value'}})
    >>> dict(d)  # but is exactly like a normal dictionary.
    {'dict1': {'innerkey': 'value'}}
    
    2 và
    >>> import collections
    >>> d = collections.defaultdict(dict)
    >>> d['dict1']['innerkey'] = 'value'
    >>> d  # currently a defaultdict type
    defaultdict(, {'dict1': {'innerkey': 'value'}})
    >>> dict(d)  # but is exactly like a normal dictionary.
    {'dict1': {'innerkey': 'value'}}
    
    3 từ tệp ánh xạ.

Tôi biết cách sử dụng dict khi chỉ có 2 cột (cần phải ánh xạ 1 cột) nhưng tôi không biết cách thực hiện điều này khi 3 cột cần được ánh xạ.

Sau đây là mã sử dụng mà tôi đã cố gắng thực hiện ánh xạ

>>> import collections
>>> d = collections.defaultdict(dict)
>>> d['dict1']['innerkey'] = 'value'
>>> d  # currently a defaultdict type
defaultdict(, {'dict1': {'innerkey': 'value'}})
>>> dict(d)  # but is exactly like a normal dictionary.
{'dict1': {'innerkey': 'value'}}
2:

x = dict([])
with open("Pricing Mapping_2013-04-22.csv", "rb") as in_file1:
    file_map = csv.reader(in_file1, delimiter=',')
    for row in file_map:
       typemap = [row[0],row[2]]
       x.append(typemap)

with open("Pricing_Updated_Cleaned.csv", "rb") as in_file2, open("Data Scraper_GDN.csv", "wb") as out_file:
    writer = csv.writer(out_file, delimiter=',')
    for row in csv.reader(in_file2, delimiter=','):
         try:
              row[27] = x[row[11]]
         except KeyError:
              row[27] = ""
         writer.writerow(row)

Nó trả lại

d = {}  # can use defaultdict(dict) instead

for row in file_map:
    # derive row key from something 
    # when using defaultdict, we can skip the next step creating a dictionary on row_key
    d[row_key] = {} 
    for idx, col in enumerate(row):
        d[row_key][idx] = col
0.

Sau một số nghiên cứu, tôi nghĩ rằng tôi cần tạo ra một tài sản lồng nhau, nhưng tôi không biết làm thế nào để làm điều này.

SMCI

30.5K18 Huy hiệu vàng110 Huy hiệu bạc145 Huy hiệu đồng18 gold badges110 silver badges145 bronze badges

Đã hỏi ngày 2 tháng 5 năm 2013 lúc 8:14May 2, 2013 at 8:14

4

Một tài sản lồng nhau là một từ điển trong một từ điển. Một điều rất đơn giản.

>>> d = {}
>>> d['dict1'] = {}
>>> d['dict1']['innerkey'] = 'value'
>>> d['dict1']['innerkey2'] = 'value2'
>>> d
{'dict1': {'innerkey': 'value', 'innerkey2': 'value2'}}

Bạn cũng có thể sử dụng

d = {}  # can use defaultdict(dict) instead

for row in file_map:
    # derive row key from something 
    # when using defaultdict, we can skip the next step creating a dictionary on row_key
    d[row_key] = {} 
    for idx, col in enumerate(row):
        d[row_key][idx] = col
1 từ gói
d = {}  # can use defaultdict(dict) instead

for row in file_map:
    # derive row key from something 
    # when using defaultdict, we can skip the next step creating a dictionary on row_key
    d[row_key] = {} 
    for idx, col in enumerate(row):
        d[row_key][idx] = col
2 để tạo điều kiện tạo từ điển lồng nhau.

>>> import collections
>>> d = collections.defaultdict(dict)
>>> d['dict1']['innerkey'] = 'value'
>>> d  # currently a defaultdict type
defaultdict(, {'dict1': {'innerkey': 'value'}})
>>> dict(d)  # but is exactly like a normal dictionary.
{'dict1': {'innerkey': 'value'}}

Bạn có thể điền vào đó tuy nhiên bạn muốn.

Tôi muốn giới thiệu trong mã của bạn một cái gì đó như sau:

d = {}  # can use defaultdict(dict) instead

for row in file_map:
    # derive row key from something 
    # when using defaultdict, we can skip the next step creating a dictionary on row_key
    d[row_key] = {} 
    for idx, col in enumerate(row):
        d[row_key][idx] = col

Theo bình luận của bạn:

Có thể ở trên mã đang gây nhầm lẫn câu hỏi. Vấn đề của tôi trong Nutshell: Tôi có 2 tệp A.CSV B.CSV, A.CSV có 4 cột I J K L, B.CSV cũng có các cột này. Tôi là loại cột chính cho các CSV này '. Cột J K L trống trong a.csv nhưng dân cư trong B.CSV. Tôi muốn ánh xạ các giá trị của các cột j k

Đề xuất của tôi sẽ là một cái gì đó như thế này (mà không sử dụng DefaultDict):

a_file = "path/to/a.csv"
b_file = "path/to/b.csv"

# read from file a.csv
with open(a_file) as f:
    # skip headers
    f.next()
    # get first colum as keys
    keys = (line.split(',')[0] for line in f) 

# create empty dictionary:
d = {}

# read from file b.csv
with open(b_file) as f:
    # gather headers except first key header
    headers = f.next().split(',')[1:]
    # iterate lines
    for line in f:
        # gather the colums
        cols = line.strip().split(',')
        # check to make sure this key should be mapped.
        if cols[0] not in keys:
            continue
        # add key to dict
        d[cols[0]] = dict(
            # inner keys are the header names, values are columns
            (headers[idx], v) for idx, v in enumerate(cols[1:]))

Mặc dù vậy, xin lưu ý rằng để phân tích các tệp CSV, có một mô -đun CSV.

Đã trả lời ngày 2 tháng 5 năm 2013 lúc 8:24May 2, 2013 at 8:24

Inbar Roseinbar RoseInbar Rose

39,7K24 Huy hiệu vàng82 Huy hiệu bạc128 Huy hiệu đồng24 gold badges82 silver badges128 bronze badges

1

Cập nhật: Để có độ dài tùy ý của một từ điển lồng nhau, hãy đi đến câu trả lời này.: For an arbitrary length of a nested dictionary, go to this answer.

Sử dụng chức năng DefaultDICT từ các bộ sưu tập.

Hiệu suất cao: "Nếu khóa không trong Dict" rất tốn kém khi tập dữ liệu lớn.

Bảo trì thấp: Làm cho mã dễ đọc hơn và có thể dễ dàng mở rộng.

from collections import defaultdict

target_dict = defaultdict(dict)
target_dict[key1][key2] = val

Đã trả lời ngày 7 tháng 12 năm 2015 lúc 20:22Dec 7, 2015 at 20:22

JunchenjunchenJunchen

1.7192 huy hiệu vàng18 Huy hiệu bạc25 Huy hiệu đồng2 gold badges18 silver badges25 bronze badges

3

Đối với các cấp độ của Nestness tùy ý:

In [2]: def nested_dict():
   ...:     return collections.defaultdict(nested_dict)
   ...:

In [3]: a = nested_dict()

In [4]: a
Out[4]: defaultdict(, {})

In [5]: a['a']['b']['c'] = 1

In [6]: a
Out[6]:
defaultdict(,
            {'a': defaultdict(,
                         {'b': defaultdict(,
                                      {'c': 1})})})

Đã trả lời ngày 30 tháng 3 năm 2016 lúc 4:18Mar 30, 2016 at 4:18

Andrewandrewandrew

1.77319 huy hiệu bạc18 Huy hiệu đồng19 silver badges18 bronze badges

1

Điều quan trọng cần nhớ khi sử dụng các mô -đun DicticTict và các mô -đun lồng nhau tương tự như

d = {}  # can use defaultdict(dict) instead

for row in file_map:
    # derive row key from something 
    # when using defaultdict, we can skip the next step creating a dictionary on row_key
    d[row_key] = {} 
    for idx, col in enumerate(row):
        d[row_key][idx] = col
3, việc tìm kiếm một khóa không tồn tại có thể vô tình tạo ra một mục nhập khóa mới trong Dict và gây ra nhiều sự tàn phá.

Dưới đây là một ví dụ Python3 với mô -đun

d = {}  # can use defaultdict(dict) instead

for row in file_map:
    # derive row key from something 
    # when using defaultdict, we can skip the next step creating a dictionary on row_key
    d[row_key] = {} 
    for idx, col in enumerate(row):
        d[row_key][idx] = col
3:

import nested_dict as nd
nest = nd.nested_dict()
nest['outer1']['inner1'] = 'v11'
nest['outer1']['inner2'] = 'v12'
print('original nested dict: \n', nest)
try:
    nest['outer1']['wrong_key1']
except KeyError as e:
    print('exception missing key', e)
print('nested dict after lookup with missing key.  no exception raised:\n', nest)

# Instead, convert back to normal dict...
nest_d = nest.to_dict(nest)
try:
    print('converted to normal dict. Trying to lookup Wrong_key2')
    nest_d['outer1']['wrong_key2']
except KeyError as e:
    print('exception missing key', e)
else:
    print(' no exception raised:\n')

# ...or use dict.keys to check if key in nested dict
print('checking with dict.keys')
print(list(nest['outer1'].keys()))
if 'wrong_key3' in list(nest.keys()):

    print('found wrong_key3')
else:
    print(' did not find wrong_key3')

Đầu ra là:

original nested dict:   {"outer1": {"inner2": "v12", "inner1": "v11"}}

nested dict after lookup with missing key.  no exception raised:  
{"outer1": {"wrong_key1": {}, "inner2": "v12", "inner1": "v11"}} 

converted to normal dict. 
Trying to lookup Wrong_key2 

exception missing key 'wrong_key2' 

checking with dict.keys 

['wrong_key1', 'inner2', 'inner1']  
did not find wrong_key3

SMCI

30.5K18 Huy hiệu vàng110 Huy hiệu bạc145 Huy hiệu đồng18 gold badges110 silver badges145 bronze badges

Đã hỏi ngày 2 tháng 5 năm 2013 lúc 8:14Mar 3, 2017 at 20:26

Một tài sản lồng nhau là một từ điển trong một từ điển. Một điều rất đơn giản.Gerard G

Bạn cũng có thể sử dụng

d = {}  # can use defaultdict(dict) instead

for row in file_map:
    # derive row key from something 
    # when using defaultdict, we can skip the next step creating a dictionary on row_key
    d[row_key] = {} 
    for idx, col in enumerate(row):
        d[row_key][idx] = col
1 từ gói
d = {}  # can use defaultdict(dict) instead

for row in file_map:
    # derive row key from something 
    # when using defaultdict, we can skip the next step creating a dictionary on row_key
    d[row_key] = {} 
    for idx, col in enumerate(row):
        d[row_key][idx] = col
2 để tạo điều kiện tạo từ điển lồng nhau.2 silver badges4 bronze badges

pip install addict
>>> d = {}
>>> d['dict1'] = {}
>>> d['dict1']['innerkey'] = 'value'
>>> d['dict1']['innerkey2'] = 'value2'
>>> d
{'dict1': {'innerkey': 'value', 'innerkey2': 'value2'}}
0

References:

  1. Bạn có thể điền vào đó tuy nhiên bạn muốn.
  2. Tôi muốn giới thiệu trong mã của bạn một cái gì đó như sau:

Theo bình luận của bạn:Apr 20, 2021 at 10:06

Có thể ở trên mã đang gây nhầm lẫn câu hỏi. Vấn đề của tôi trong Nutshell: Tôi có 2 tệp A.CSV B.CSV, A.CSV có 4 cột I J K L, B.CSV cũng có các cột này. Tôi là loại cột chính cho các CSV này '. Cột J K L trống trong a.csv nhưng dân cư trong B.CSV. Tôi muốn ánh xạ các giá trị của các cột j kXerCis

Đề xuất của tôi sẽ là một cái gì đó như thế này (mà không sử dụng DefaultDict):5 silver badges4 bronze badges

Mặc dù vậy, xin lưu ý rằng để phân tích các tệp CSV, có một mô -đun CSV.

>>> d = {}
>>> d['dict1'] = {}
>>> d['dict1']['innerkey'] = 'value'
>>> d['dict1']['innerkey2'] = 'value2'
>>> d
{'dict1': {'innerkey': 'value', 'innerkey2': 'value2'}}
1

Example:

>>> d = {}
>>> d['dict1'] = {}
>>> d['dict1']['innerkey'] = 'value'
>>> d['dict1']['innerkey2'] = 'value2'
>>> d
{'dict1': {'innerkey': 'value', 'innerkey2': 'value2'}}
2

Đã trả lời ngày 2 tháng 5 năm 2013 lúc 8:24Oct 7, 2020 at 12:10

Inbar Roseinbar Roseconmak

39,7K24 Huy hiệu vàng82 Huy hiệu bạc128 Huy hiệu đồng8 silver badges13 bronze badges

Cập nhật: Để có độ dài tùy ý của một từ điển lồng nhau, hãy đi đến câu trả lời này.

>>> d = {}
>>> d['dict1'] = {}
>>> d['dict1']['innerkey'] = 'value'
>>> d['dict1']['innerkey2'] = 'value2'
>>> d
{'dict1': {'innerkey': 'value', 'innerkey2': 'value2'}}
3

Sử dụng chức năng DefaultDICT từ các bộ sưu tập.

>>> d = {}
>>> d['dict1'] = {}
>>> d['dict1']['innerkey'] = 'value'
>>> d['dict1']['innerkey2'] = 'value2'
>>> d
{'dict1': {'innerkey': 'value', 'innerkey2': 'value2'}}
4

Hiệu suất cao: "Nếu khóa không trong Dict" rất tốn kém khi tập dữ liệu lớn.

Bảo trì thấp: Làm cho mã dễ đọc hơn và có thể dễ dàng mở rộng.

Đã trả lời ngày 7 tháng 12 năm 2015 lúc 20:22Jan 11, 2021 at 8:38

JunchenjunchenShah Vipul

1.7192 huy hiệu vàng18 Huy hiệu bạc25 Huy hiệu đồng4 silver badges9 bronze badges

>>> d = {}
>>> d['dict1'] = {}
>>> d['dict1']['innerkey'] = 'value'
>>> d['dict1']['innerkey2'] = 'value2'
>>> d
{'dict1': {'innerkey': 'value', 'innerkey2': 'value2'}}
5

Đối với các cấp độ của Nestness tùy ý:

Đã trả lời ngày 30 tháng 3 năm 2016 lúc 4:18Mar 10, 2021 at 14:44

>>> d = {}
>>> d['dict1'] = {}
>>> d['dict1']['innerkey'] = 'value'
>>> d['dict1']['innerkey2'] = 'value2'
>>> d
{'dict1': {'innerkey': 'value', 'innerkey2': 'value2'}}
6

4b0

Andrewandrew30 gold badges92 silver badges137 bronze badges

1.77319 huy hiệu bạc18 Huy hiệu đồngMar 26, 2021 at 8:47

1

Điều quan trọng cần nhớ khi sử dụng các mô -đun DicticTict và các mô -đun lồng nhau tương tự như

d = {}  # can use defaultdict(dict) instead

for row in file_map:
    # derive row key from something 
    # when using defaultdict, we can skip the next step creating a dictionary on row_key
    d[row_key] = {} 
    for idx, col in enumerate(row):
        d[row_key][idx] = col
3, việc tìm kiếm một khóa không tồn tại có thể vô tình tạo ra một mục nhập khóa mới trong Dict và gây ra nhiều sự tàn phá.

>>> d = {}
>>> d['dict1'] = {}
>>> d['dict1']['innerkey'] = 'value'
>>> d['dict1']['innerkey2'] = 'value2'
>>> d
{'dict1': {'innerkey': 'value', 'innerkey2': 'value2'}}
7
>>> d = {}
>>> d['dict1'] = {}
>>> d['dict1']['innerkey'] = 'value'
>>> d['dict1']['innerkey2'] = 'value2'
>>> d
{'dict1': {'innerkey': 'value', 'innerkey2': 'value2'}}
8

Dưới đây là một ví dụ Python3 với mô -đun

d = {}  # can use defaultdict(dict) instead

for row in file_map:
    # derive row key from something 
    # when using defaultdict, we can skip the next step creating a dictionary on row_key
    d[row_key] = {} 
    for idx, col in enumerate(row):
        d[row_key][idx] = col
3:

>>> d = {}
>>> d['dict1'] = {}
>>> d['dict1']['innerkey'] = 'value'
>>> d['dict1']['innerkey2'] = 'value2'
>>> d
{'dict1': {'innerkey': 'value', 'innerkey2': 'value2'}}
9

Đầu ra là:Mar 8 at 17:12

edd313edd313edd313

Đã trả lời ngày 3 tháng 3 năm 2017 lúc 20:264 silver badges12 bronze badges