2013-04-15 35 views
22

Tôi tự hỏi liệu có một cách nhanh hơn và ít tốn thời gian để lặp qua danh sách các bộ dữ liệu, tìm đúng đối sánh hay không. Những gì tôi làm là:lặp lại nhanh chóng thông qua danh sách các bộ dữ liệu

# this is a very long list. 
my_list = [ (old1, new1), (old2, new2), (old3, new3), ... (oldN, newN)] 

# go through entire list and look for match 
for j in my_list: 
    if j[0] == VALUE: 
     PAIR_FOUND = True 
     MATCHING_VALUE = j[1] 
     break 

Mã này có thể mất nhiều thời gian để thực thi, tùy thuộc vào số lượng mục trong danh sách. Tôi chắc chắn có một cách tốt hơn để làm điều này.

Trả lời

14

Giả sử sử dụng bộ nhớ nhiều hơn một chút không phải là vấn đề và nếu mục đầu tiên của bộ dữ liệu có thể băm, bạn có thể tạo dict trong danh sách bộ và sau đó tra cứu giá trị đơn giản như tìm kiếm khóa từ số dict. Một cái gì đó như:

dct = dict(tuples) 
val = dct.get(key) # None if item not found else the corresponding value 

EDIT: Để tạo một ánh xạ ngược lại, sử dụng một cái gì đó như:

revDct = dict((val, key) for (key, val) in tuples) 
+0

trông rất tuyệt nhưng sẽ chỉ cho phép tôi tìm kiếm bằng 'giá trị cũ'. sao tôi cần phải tạo hai dicts để tôi có thể tìm kiếm trong các trường giá trị mới và cũ? – memyself

+0

@memyself: Có, bạn đã đúng. Nếu bạn cần tìm kiếm theo cả * cả hai giá trị cũ và mới, bạn sẽ phải tạo hai dicts. Nhưng tôi đoán nó không phải là xấu nếu tất cả các bạn muốn là nhanh chóng tra cứu. Tôi đã thêm đoạn mã mẫu để tạo dict ngược. –

+0

Tôi không biết về get(), điều này đã làm cho cuộc sống của tôi đơn giản hơn rất nhiều. – dgBP

25

Tôi nghĩ rằng bạn có thể sử dụng

for j,k in my_list: 
    [ ... stuff ... ] 
+1

nhưng điều đó sẽ không làm cho vòng lặp thực hiện nhanh hơn. phải không? – memyself

+0

Bạn nên kiểm tra câu hỏi khác này: http://stackoverflow.com/questions/2191699/find-an-element-in-a-list-of-tuples – Eric

+0

tìm thấy nó dễ hiểu, tks –

2

Mã này có thể được làm sạch, nhưng nếu bạn đang sử dụng một danh sách để lưu trữ các bộ của bạn, bất cứ tra cứu như vậy sẽ là O (N).

Nếu tốc độ tra cứu là quan trọng, bạn nên sử dụng dict để lưu trữ bộ dữ liệu của mình. Chìa khóa phải là phần tử thứ 0 của bộ dữ liệu của bạn, vì đó là những gì bạn đang tìm kiếm. Bạn có thể dễ dàng tạo ra một dict ra khỏi danh sách của bạn:

my_dict = dict(my_list) 

Sau đó, (VALUE, my_dict[VALUE]) sẽ cung cấp cho bạn phù hợp tuple bạn (giả sử VALUE tồn tại).

0

Tôi tự hỏi liệu phương pháp dưới đây là những gì bạn muốn.

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

>>> from collections import defaultdict 
>>> s = [('red',1), ('blue',2), ('red',3), ('blue',4), ('red',1), ('blue',4)] 
>>> d = defaultdict(list) 
>>> for k, v in s: 
     d[k].append(v)  
>>> sorted(d.items()) 
[('blue', [2, 4, 4]), ('red', [1, 3, 1])] 
1

Câu hỏi đặt ra là chết nhưng vẫn còn biết thêm một cách không đau đớn:

my_list = [ (old1, new1), (old2, new2), (old3, new3), ... (oldN, newN)] 

for first,*args in my_list: 
    if first == Value: 
     PAIR_FOUND = True 
     MATCHING_VALUE = args 
     break 
Các vấn đề liên quan