2012-02-29 28 views
7

Tôi cố gắng để in ra một cuốn từ điển bằng Python:Làm thế nào để thực hiện mảng kết hợp (không phải từ điển) trong Python?

Dictionary = {"Forename":"Paul","Surname":"Dinh"} 
for Key,Value in Dictionary.iteritems(): 
    print Key,"=",Value 

Mặc dù mục "tên đầu tiên" được liệt kê đầu tiên, nhưng từ điển bằng Python dường như được sắp xếp theo giá trị, vì vậy kết quả là như thế này:

Surname = Dinh 
Forename = Paul 

Làm thế nào để in ra những việc này với thứ tự trong mã hoặc thứ tự khi mặt hàng được gắn trong (không được sắp xếp theo giá trị cũng không bằng phím)?

+3

Bạn có thể sử dụng một danh sách bổ sung của các phím để xác định thứ tự – Nobody

+0

tôi đang nghĩ sử dụng 2 danh sách (mảng python), sau đó sử dụng "liệt kê", nhưng điều này phức tạp – jondinham

+3

Bạn cũng cần có khả năng truy cập nhanh chóng bằng khóa không? –

Trả lời

15

Bạn có thể sử dụng danh sách các bộ dữ liệu (hoặc danh sách các danh sách). Như thế này:

Arr= [("Forename","Paul"),("Surname","Dinh")] 
for Key,Value in Arr: 
    print Key,"=",Value 

Forename = Paul 
Surname = Dinh 

bạn có thể làm một cuốn từ điển trong số này với:

Dictionary=dict(Arr) 

Và các phím được sắp xếp một cách chính xác như thế này:

keys = [k for k,v in Arr] 

Sau đó làm điều này:

for k in keys: print k,Dictionary[k] 

nhưng tôi đồng ý với nhận xét về câu hỏi của bạn: Việc sắp xếp các khóa theo thứ tự được yêu cầu có lặp lại không dễ dàng?

EDIT: (cảm ơn bạn Rik Poggi), OrderedDict thực hiện điều này cho bạn:

od=collections.OrderedDict(Arr) 
for k in od: print k,od[k] 
+0

có được sử dụng không: Arr = [["Tên" "," Paul "], [" Họ "," Định "]] thay vào đó? – jondinham

+3

danh sách các bộ dữ liệu là cách 'OrderedDict' được thực hiện, nếu từ điển là cấu trúc mà OP đang tìm kiếm, người đó chỉ nên sử dụng chúng và tiết kiệm đau chuyển đổi mỗi lần. –

+1

@RikPoggi. Ah, thêm vào đó. –

3

'nhưng từ điển bằng Python được sắp xếp theo giá trị' có lẽ tôi là nhầm lẫn ở đây nhưng những gì trò chơi bạn đó là ideea? Từ điển không được sắp xếp theo bất kỳ thứ gì.

Bạn sẽ có hai giải pháp, hoặc giữ danh sách các khóa bổ sung vào từ điển hoặc sử dụng cấu trúc dữ liệu khác như mảng hoặc mảng.

4

này có thể đáp ứng nhu cầu của bạn tốt hơn:

Dictionary = {"Forename":"Paul","Surname":"Dinh"} 
KeyList = ["Forename", "Surname"] 
for Key in KeyList: 
    print Key,"=",Dictionary[Key] 
+0

nhưng đối với hầu hết thời gian tôi dường như không biết danh sách các phím – jondinham

+1

Vậy làm thế nào để bạn biết sắp xếp :) –

+0

có một trường hợp: giả sử 'Từ điển' được truyền lại cho tôi bằng một hàm. và tôi muốn giữ thứ tự của các giá trị được tạo ra bởi hàm đó (ví dụ 'append') – jondinham

16

Đầu tiên của tất cả các từ điển không được sắp xếp ở tất cả cũng không phải bằng khóa hoặc giá trị.

Và dựa trên mô tả của bạn. Bạn actualy cần collections.OrderedDict mô-đun

from collections import OrderedDict 

my_dict = OrderedDict([("Forename", "Paul"), ("Surname", "Dinh")]) 

for key, value in my_dict.iteritems(): 
    print '%s = %s' % (key, value) 

Lưu ý rằng bạn cần phải nhanh chóng OrderedDict từ danh sách các hàng không từ dict khác như dict dụ sẽ xáo trộn thứ tự các mặt hàng trước khi OrderedDict sẽ được khởi tạo.

+0

Vì vậy, bắt đầu từ Python 3.6 dicts giữ thứ tự khóa. – lig

3

Tôi tự hỏi nếu nó là một ra lệnh dict mà bạn muốn:

>>> k = "one two three four five".strip().split() 
>>> v = "a b c d e".strip().split() 
>>> k 
    ['one', 'two', 'three', 'four', 'five'] 
>>> v 
    ['a', 'b', 'c', 'd', 'e'] 
>>> dx = dict(zip(k, v)) 
>>> dx 
    {'four': 'd', 'three': 'c', 'five': 'e', 'two': 'b', 'one': 'a'} 
>>> for itm in dx: 
     print(itm) 

    four 
    three 
    five 
    two 
    one 

>>> # instantiate this data structure from OrderedDict class in the Collections module 
>>> from Collections import OrderedDict 
>>> dx = OrderedDict(zip(k, v)) 
>>> for itm in dx: 
     print(itm) 

    one 
    two 
    three 
    four 
    five 

Một từ điển được tạo bằng OrderdDict giữ gìn trật tự chèn gốc.

Đặt một cách khác, từ điển đó lặp lại qua các cặp khóa/giá trị theo thứ tự mà chúng được chèn vào.

Vì vậy, ví dụ, khi bạn xóa một chìa khóa và sau đó thêm các khóa tương tự một lần nữa, trình tự lặp là thay đổi:

>>> del dx['two'] 
>>> for itm in dx: 
     print(itm) 

     one 
     three 
     four 
     five 

>>> dx['two'] = 'b' 
>>> for itm in dx: 
     print(itm) 

     one 
     three 
     four 
     five 
     two 
+0

Tại sao không sử dụng mã từ câu hỏi? – lig

+0

là cần thiết để bạn có thể hiểu câu trả lời của tôi? Trong thực tế, tôi không sử dụng dữ liệu mẫu của OP vì hai lý do: (i) chúng ta đang nói về các chuỗi được sắp xếp ở đây và dữ liệu của OP chỉ có * hai cặp khóa * giá trị; và (ii) tôi đã chọn các khóa và giá trị cho dữ liệu mẫu của mình cho phép người đọc dễ dàng xem được mã của tôi - tức là, bảo quản trật tự. – doug

Các vấn đề liên quan