2015-05-20 33 views
5

Tôi có 2 danh sách mà tôi đã tạo và thêm giá trị gia tăng cho mỗi mục. Lý do là các giá trị trong mỗi danh sách sẽ được nối với nhau trong một từ điển. Tuy nhiên các giá trị trong mỗi danh sách không phải là một cặp 1 đến 1 .. đây là lý do tại sao tôi đã thêm các giá trị gia tăng để hỗ trợ liên kết từng khóa với giá trị tương ứng của nó (s).Python- thêm vào từ điển dựa trên giá trị gia tăng trong 2 danh sách

Dưới đây là một số dữ liệu ví dụ từ danh sách của tôi:

list_a = ['abc|1','bcd|2','cde|3'] 
list_b = ['1234|1','2345|2','3456|2','4567|2','5678|3'] 

Vì vậy, lý tưởng những gì tôi đang tìm cách để làm được điều hành thông qua cả hai danh sách và sau đó tạo ra một từ điển dựa trên cặp bởi các giá trị incrementing. Tôi đoán các giá trị khi áp dụng sẽ phải là một danh sách?

Dưới đây là sản phẩm lý tưởng:

my_dict = {'abc|1':'1234|1','bcd|2':['2345|2','3456|2','4567|2'],'cde|3':'5678|3'}  

Bất kỳ trợ giúp sẽ được đánh giá rất nhiều, Cảm ơn trước :)

+0

Cảm ơn tất cả các bạn đã trả lời nhanh chóng! Nó được đánh giá cao :) – Nunchux

Trả lời

2
list_a = ['abc|1','bcd|2','cde|3'] 
list_b = ['1234|1','2345|2','3456|2','4567|2','5678|3'] 

tmp = {k.split('|')[1]: (k, []) for k in list_a} 
for v in list_b: 
    tmp[v.split('|')[1]][1].append(v) 
my_dict = dict(tmp.values()) 

Điều này nhận được đóng vào những gì bạn đã đăng làm mục tiêu, nhưng tôi nghĩ nó thực sự tốt hơn.

goal: {'abc|1': '1234|1', 'bcd|2': ['2345|2', '3456|2', '4567|2'], 'cde|3': '5678|3' } 
mine: {'abc|1': ['1234|1'], 'bcd|2': ['2345|2', '3456|2', '4567|2'], 'cde|3': ['5678|3']} 

Bạn có thể thấy chúng tôi chỉ khác nhau bằng cách đặt đĩa đơn vào danh sách (tôi) hoặc không (bạn). Lý do tôi nghĩ cách của tôi tốt hơn là vì bất kỳ mã nào sử dụng kết quả này sẽ dễ dàng hơn nếu tất cả các giá trị là danh sách, vì vậy nó không cần xử lý cả chuỗi đơn và danh sách chuỗi. Giống như tôi đã dễ dàng hơn để sản xuất danh sách duy nhất.

Nhưng nếu bạn vẫn thích theo cách của bạn, thay đổi dòng cuối cùng ở trên của tôi để:

my_dict = {k: v if len(v) > 1 else v[0] for k, v in tmp.values()} 
+1

Cảm ơn bạn đã trả lời, tôi đồng ý rằng việc đưa đĩa đơn vào danh sách là cách tốt nhất để chuyển tiếp :) – Nunchux

2

Bạn có thể làm cho hai dicts nhóm với người đầu tiên:

list_a = ['abc|1','bcd|2','cde|3'] 
list_b = ['1234|1','2345|2','3456|2','4567|2','5678|3'] 

d = defaultdict(list) 
from itertools import chain 
for k in chain(list_a,list_b): 
    d[k.rsplit("|",1)[1]].append(k) 
print(d) 

print({v[0]:v[1:] for v in d.values()}) 

defaultdict(<type 'list'>, {'1': ['abc|1', '1234|1'], '3': ['cde|3', '5678|3'], '2': ['bcd|2', '2345|2', '3456|2', '4567|2']}) 
{'abc|1': ['1234|1'], 'cde|3': ['5678|3'], 'bcd|2': ['2345|2', '3456|2', '4567|2']} 

Bạn có thể tránh danh sách cho các giá trị đơn lẻ bằng cách kiểm tra độ dài đầu tiên nếu cần.

d = {v[0]: (v[1:] if len(v)> 2 else v[-1]) for v in d.values()} 
print(d) 

{'abc|1': '1234|1', 'cde|3': '5678|3', 'bcd|2': ['2345|2', '3456|2', '4567|2']} 

Sử dụng python3 cú pháp là một chút đẹp hơn bằng extended iterable unpacking:

d = {k: (val if len(val) > 1 else val[0]) for k,*val in d.values()} 
print(d) 

Nếu bạn muốn trật tự dựa trên các phím trong Lista bạn sẽ cần một OrderedDict:

list_a = ['abc|1', 'bcd|2', 'cde|3'] 
list_b = ['1234|1', '2345|2', '3456|2', '4567|2', '5678|3'] 
from collections import OrderedDict 
from itertools import chain 

od = OrderedDict() 

for k in chain(list_a, list_b): 
    od.setdefault(k.rsplit("|",1)[1], []).append(k) 

d = OrderedDict((k, (val)) for k, *val in od.values()) 
2

Nó có thể đạt được từ một cái gì đó như thế này

temp_dict = {} 
for x in list_a: 
    val = x.split('|')[1] 
    temp_dict[x] = [y for y in list_b if y.endswith("|" + val)] 
+0

Giải pháp sẽ thất bại nếu 'val' lên tới 11. –

+0

Cảm ơn bạn đã chỉ ra sai lầm, tôi đoán bây giờ nên làm ... :) – shaktimaan

0

Dưới đây là một mã rất có thể đọc được, nó phải là đủ rõ ràng nhưng nếu bạn có nghi ngờ về nó xin vui lòng bình luận. Bạn có thể sử dụng OrderedDict thay vì một dict bình thường() nếu bạn muốn giữ thứ tự của khóa khi chúng được thêm vào từ điển.

list_a = ['abc|1','bcd|2','cde|3'] 
list_b = ['1234|1','2345|2','3456|2','4567|2','5678|3'] 

d = dict() 
for item in list_a: 
    d.update({item:[]}) # initialize the dictionary 
    value_a = item.split('|')[1] # extract the number from the item of list_a 
    for thing in list_b: 
     value_b = thing.split('|')[1] # extract the number from the item of list_b 
     if value_a == value_b: # if the numbers are the same 
      d[item].append(thing) # append the item of list_b into the dictionary 


print(d) 
Các vấn đề liên quan