2013-04-05 59 views
6

Tôi có một danh sách liệt kê:Tìm kiếm một danh sách sử dụng một chuỗi

A = [['andy', 'dear', 'boy', 'tobe', 'todo'], 
     ['where', 'what', 'when', 'how'], 
     ['korea', 'japan', 'china', 'usa'], 
     ['tweet', 'where', 'why', 'how']] 

Tôi có ba câu hỏi để được chính xác:

  1. Làm thế nào để lấy một danh sách phụ khỏi danh sách này sử dụng một yếu tố cụ thể làm từ khóa?
    Ví dụ: tôi muốn truy xuất tất cả các danh sách có yếu tố 'tại sao' trong đó?
    cách tốt nhất để làm như vậy là gì?
  2. Làm cách nào để truy xuất danh sách phụ từ danh sách này bằng cách sử dụng một phần của một yếu tố cụ thể làm từ khóa?
    Ví dụ: tôi muốn truy xuất tất cả các danh sách có các phần tử có chứa 'wh' khi bắt đầu
    ký tự của bất kỳ phần tử nào?
  3. Làm cách nào để có được vị trí hoặc chỉ mục của các danh sách con kết quả từ bất kỳ phương pháp tìm kiếm nào trong số hai phương pháp tìm kiếm này?

Tôi quen thuộc với khái niệm thu hồi tất cả các yếu tố từ một danh sách với phù hợp với một từ khóa cụ thể, nhưng khó hiểu của nó khi nói đến lấy tất cả các danh sách phù hợp với một từ khoá cụ thể ...

Bất kỳ đoán sao? Cảm ơn trước.

Trả lời

2

Đối đầu tiên:

>>> for l in A: 
...  if 'why' in l: 
...    print l 
... 
['tweet', 'where', 'why', 'how'] 

Đối với thứ hai: (wy bất kỳ nơi)

>>> for l in A: 
...  for i in l: 
...    if 'wh' in i: 
...      print l 
...      break 
... 
['where', 'what', 'when', 'how'] 
['tweet', 'where', 'why', 'how'] 

để kiểm tra ngay từ đầu thử điều này: (sử dụng startswith() từ @Harido)

>>> for l in A: 
...  for i in l: 
...    if i.startswith('wh'): 
...      print l 
...      break 
... 
['where', 'what', 'when', 'how'] 
['tweet', 'where', 'why', 'how'] 

Đối thứ ba:

Để tìm chỉ mục, bạn có thể sử dụng phương pháp A.index(l) sau nhị hoa in ví dụ:

>>> for l in A: 
...  for i in l: 
...    if 'wh' in i: 
...      print l 
...      print A.index(l) 
...      break 
... 
['where', 'what', 'when', 'how'] 
1 
['tweet', 'where', 'why', 'how'] 
3 

Nhưng hãy nhớ tôi không tốt bằng Python. Một số người có thể cung cấp cho bạn những cách tốt hơn. (Tôi viết thư này C như mã số đó là người nghèo) Tôi muốn chia sẻ liên kết này: Guido van Rossum

Sửa:

nhờ @Jaime để gợi ý cho tôi for k, l in enumerate(A):

>>> for k, l in enumerate(A): 
...  for i in l: 
...    if 'wh' in i: 
...      print l 
...      print "index =", k 
...      break 
... 
['where', 'what', 'when', 'how'] 
index = 1 
['tweet', 'where', 'why', 'how'] 
index = 3 
+1

Chụp đẹp, Grijesh! Điều này rất tốt. Tôi chỉ có thể đánh dấu một câu hỏi là một câu trả lời đúng, và có lẽ bạn là câu trả lời. Hãy để tôi chờ đợi cho các câu trả lời tiếp theo giải quyết 2 và 3 quá (hoặc có thể nếu bạn có thể thêm). – khan

+0

@khan ok xem xét xong. Nhưng tôi không giỏi trong Python chờ một người như [martijn-pieters] (http://stackoverflow.com/users/100297/martijn-pieters) để có câu trả lời tốt hơn –

+1

Thay vì làm 'A.index (l)', thay đổi vòng lặp for thành 'for k, l in enumerate (A):' và 'k' là chỉ mục' l' mà không cần tìm nó. – Jaime

0

bạn muốn làm điều này giống như cách bạn làm điều đó cho một danh sách duy nhất, ngoại trừ bạn sẽ yêu cầu thêm vòng lặp:

for inner_list in A: 
    for element in inner_list: 
     if # <some condition> 
      # <do something> 

Đối với posi tions, thêm enumerate vào vòng lặp cụ thể bạn muốn vị trí sẽ trợ giúp hoặc chỉ cần sử dụng một cái gì đó như find cho mỗi danh sách bên trong cũng sẽ thực hiện công việc.

3

Đối với tất cả các câu trả lời kết hợp:

mylist = [['andy', 'dear', 'boy', 'tobe', 'todo'], ['where', 'what', 'when', 'how'], ['korea', 'japan', 'china', 'usa'], ['tweet', 'where', 'why', 'how']] 
for num, sublist in enumerate(mylist): 
    if 'why' in sublist: 
     print sublist 
    for ele in sublist: 
     if ele.startswith('wh'): 
      print ele, num 
+0

Cảm ơn, Haidro. Cái này thật sự rất tốt. Tôi không có ý tưởng rằng một cái gì đó như string.startswith() và string.endswith() đã tồn tại. Cảm ơn rất nhiều. :-) – khan

+0

@khan đó là những chức năng khiến tôi yêu sự đơn giản của python: D – TerryA

+0

@Haidro Cách tốt nhất để lấy chỉ mục bằng python đang sử dụng 'liệt kê'. Kiểm tra 'A.index (x)' sẽ phải tìm kiếm danh sách một lần nữa cho mục và do đó sẽ không hoạt động đối với các danh sách trùng lặp – jamylak

0

a. giả sử bạn có danh sách A và từ bạn đang tìm kiếm là x.

def howmuch(word) 
    lis = [] 
    for x in A: 
     //point A 
     if x.count(word) > 0: 
     //point A 
      lis.append(x) 
    return lis 

Về cơ bản, đây là danh sách chứa tất cả các danh sách có từ đó. bạn lặp qua danh sách gốc. mỗi phần tử x là một danh sách. x.count (word) cho bạn biết số lần từ đó nằm trong danh sách này. 0 có nghĩa là nó không bao giờ xuất hiện trong danh sách. vì vậy nếu nó lớn hơn 0, nó phải nằm trong danh sách. nếu có, chúng tôi đã thêm vào biến lis của mình. sau đó chúng tôi trả lại.

b. nó cũng giống như vấn đề ngoại trừ ở điểm A, sau khi bạn nhận được danh sách, thực hiện một thao tác khác cho vòng lặp cho mỗi từ trong đó. cho python, có một chức năng tìm cho chuỗi để xem nếu một chuỗi con tồn tại trong đó nếu nó không tồn tại, sau đó thêm nó vào các yếu tố danh sách:

http://docs.python.org/2/library/string.html

c. cho vấn đề a, sau khi bạn kiểm tra để xem số đó lớn hơn 0, thì điều đó có nghĩa là từ tồn tại trong danh sách. làm một list.index (word) và nó sẽ trả về chỉ mục. cho vấn đề b, một khi bạn tìm thấy một chuỗi với chuỗi con thích hợp, hãy thực hiện list.index (word).

tất cả trong tất cả, bạn nên xem trang web python, nó cho bạn biết rất nhiều chức năng bạn có thể sử dụng.

+0

'cho mỗi x trong A:' là cú pháp không hợp lệ: 3. – TerryA

+0

cảm ơn bạn đã xin lỗi về điều đó, đúng là nó phải là "cho x trong A:" tôi đoán vì nó lặp lại toàn bộ danh sách, nó đã nghĩ về nó như là một cho mỗi. tôi đã nhầm lẫn với cái gì đó khác. – Jeff

0
>>> A = [['andy', 'dear', 'boy', 'tobe', 'todo'], ['where', 'what', 'when', 'how'], ['korea', 'japan', 'china', 'usa'], ['tweet', 'where', 'why', 'how']] 
>>> for i, sublist in enumerate(A): 
     if 'why' in sublist: 
      print i, sublist 


3 ['tweet', 'where', 'why', 'how'] 
>>> for i, sublist in enumerate(A): 
     if any(word.startswith('wh') for word in sublist): 
      print i, sublist 


1 ['where', 'what', 'when', 'how'] 
3 ['tweet', 'where', 'why', 'how'] 
2

Tôi yêu comprehensions danh sách và lập trình chức năng, vì vậy đây là rằng cách tiếp cận

Một

sub_list_a = [ el for el in A if 'why' in el ] 

B

sub_list_b = [ el for el in A if any(['wh' in s for s in el]) ] 

khó khăn hơn một chút để đọc, nhưng súc tích và cảm nhận ible.

C

Sau đó, để có được các chỉ số về nơi mỗi sub_lists đã được tìm thấy

location_a = [ ii for ii, el in enumerate(A) if el in sub_list_a ] 

Chỉ cần thay thế b cho a để có được những vị trí cho phần b.

+1

Thanh lịch và súc tích hơn ** B **: 'sub_list_b = [el cho el trong A nếu có ('wh' trong s cho s trong el)]'. imo cố gắng không sử dụng 'map' nếu bạn phải sử dụng' lambda' với nó – jamylak

+0

@jamylak Vâng, tôi thích điều đó tốt hơn, cảm ơn! Chỉnh sửa nhỏ, mặc dù, đó là bằng văn bản đã không làm việc cho tôi, xem ở trên. –

+1

bạn cũng nên bỏ dấu ngoặc trong 'bất kỳ' để nó sẽ trở thành trình tạo thay vì danh sách comp. – jamylak

6

đơn giản và thẳng

elem = 'why' 
index_li = [] 
for idx, item in enumerate(A): 
    for word in item: 
     if word.startswith(elem): 
      index_li.append(idx) 
      break 
print index_li 

Ví dụ

>>> elem = 'wh' 
... index_li = [] 
... for idx, item in enumerate(A): 
...  for word in item: 
...   if word.startswith(elem): 
...    print word, item 
...    index_li.append(idx) 
...    break 
... print index_li 
where ['where', 'what', 'when', 'how'] 
where ['tweet', 'where', 'why', 'how'] 
[1, 3] 
0

Bạn có thể sử dụng phương pháp đơn giản này:

>>> key='wh' 
>>> res=[(index, sublist) for index, sublist in enumerate(A) for value in sublist if value.startswith(key)] 
>>> dict(res) 
{1: ['where', 'what', 'when', 'how'], 3: ['tweet', 'where', 'why', 'how']} 

tận hưởng!

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