2015-11-16 14 views
5

Tôi đang cố gắng lặp qua danh sách đối tượng JSON lồng nhau (được trả về từ API phần còn lại twitter qua tweepy.api.search) và xóa một số đối tượng nhất định. Tôi có một danh sách các đồ vật cần giữ. Tôi muốn chỉ định các đối tượng từ điển nào cần giữ thay vì xóa đối tượng nào vì các tweet khác nhau có các khóa khác nhau. Họ đều có một số phím như "văn bản", "created_at", vv ... nhưng có các phím khác mà chỉ có một số tweet có.Gặp sự cố khi xóa một số đối tượng JSON lồng nhau trong python

Tôi đang gặp phải hai sự cố.

1) Tôi không thể xóa một mục từ điển trong khi lặp lại thông qua từ điển

2) Nhiều người trong số các đối tượng từ điển chứa danh sách lồng nhau và từ điển mà tôi đang gặp khó khăn tiếp cận

Một phần nhỏ của tập tin JSON Tôi đang duyệt qua:

{ 
"statuses": [ 
    { 
     "contributors": null, 
     "coordinates": null, 
     "created_at": "Thu Nov 12 01:28:07 +0000 2015", 
     "entities": { 
      "hashtags": [], 
      "symbols": [], 
      "urls": [ 
       { 
        "display_url": "twitter.com/thehill/status\u2026", 
        "expanded_url": "https://twitter.com/thehill/status/664581138975989761", 
        "indices": [ 
         139, 
         140 
        ], 
        "url": "https://t.co/9zfkg2FixZ" 
       } 
      ], 
      "user_mentions": [ 
       { 
        "id": 2517854953, 
        "id_str": "2517854953", 
        "indices": [ 
         3, 
         19 
        ], 
        "name": "It'sAlwaysPolitical", 
        "screen_name": "politicspodcast" 
       } 
      ] 
     }, 
     "favorite_count": 0, 
     "favorited": false, 
     "geo": null 
} 
] 
} 

Mỗi mục trong danh sách "trạng thái" là một tweet và có 100 tweet được trả về cho mỗi cuộc gọi.

Danh sách các mục mà tôi muốn giữ:

keepers_list = [tweetlist["statuses"][i]["coordinates"], 
       tweetlist["statuses"][i]["created_at"], 
       tweetlist["statuses"][i]["entities"]["urls"] 
       ] 

Tôi cố gắng để làm:

for item in tweetlist: 
    if item not in keepers_list: 
     del item 

Tôi đã thử mã chính xác này và các biến thể thêm về nó/phương pháp khác nhau hơn tôi có thể nhớ lại, nhưng không thể làm cho nó hoạt động. Tôi đã xem xét nhiều bài viết trao đổi ngăn xếp về chủ đề này, nhưng đã không thể thích nghi bất kỳ bài viết nào với mục đích của tôi.

Tôi đã cố gắng sử dụng

for key in dict.iterkeys(): ... 
for value in dict.itervalues(): ... 
for key, value in dict.iteritems(): 

nhưng tôi không thể thực hiện bất kỳ trong số họ làm việc cho những gì tôi muốn làm.

Bất kỳ trợ giúp nào hoặc chỉ cần đẩy theo đúng hướng sẽ được đánh giá cao.

Trả lời

3

Chưa bao giờ xóa các mục trong một danh sách trong khi lặp lại trên nó, bạn có thể

Tạo một bản sao của danh sách để lặp qua:

for item in tweetlist[:]: 
    ... 

Lưu kết quả mong muốn trong danh sách khác:

keep = [] 
for item in tweetlist: 
    if item in keepers_list: 
     keep.append(item) 
2

Nếu bạn muốn lọc ra một dict, bạn có thể làm điều gì đó như:

for k in dict.keys(): 
    if k not in keepers_list: 
     del(dict[k]) 
print dict 
3

Quy tắc chung về ngón tay cái của tôi trong Python là, nếu tôi thấy mình sử dụng vòng lặp, để tìm kiếm một cách tiếp cận khác. Trong trường hợp này, sử dụng một sự hiểu biết từ điển, dựa trên mục gốc:

keep = {key:tweet_list[key] for key in tweet_list.keys() if key in keepers_list} 

Trừ khi các tập dữ liệu ban đầu là rất lớn mà nó phải được xử lý tại chỗ, một sự hiểu biết nói chung là nhanh, và nếu tương đối ngắn, tự tài liệu đủ để dễ hiểu.

+0

Tôi tin rằng 'khóa: tweet_list [k] 'phải là' khóa: tweet_list [key] '? –

+0

Đúng, tôi đã bỏ lỡ điều đó, cảm ơn bạn. – Greg

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