2

2 つのリスト (これらのリストは「リストのリスト」) を実行する必要があります。これらのリストの各項目には [path,md5] が含まれ、次のように機能する if ステートメントを作成します: (論理的に)

save_list = []
for small_list2 in big_list2:
    for small_list1 in big_list1:
        if small_list2[0] == small_list1[0] and small_list2[1] != small_list2[1]:
           save_list.append(small_list2)

これが道ですか?そして、それを行うためのより良い(おそらく再帰的な方法)がありますか??

ありがとう !!

編集: 入力例:(md5 は本物でも合理的でもありません) [PATH,MD5]

big_list2 = [['/home/user/Desktop/folder/1.txt','93n8nv35732vb9527'],['/home/user/Desktop/folder/2.txt','43284fh234h'],['/home/ユーザー/デスクトップ/フォルダー/3.txt','4534v4535v353']]

big_list1 = [['/home/user/Desktop/folder/1.txt','93n8nv35732vb9528'],['/home/user/Desktop/folder/2.txt','43284fh234h'],['/home/ユーザー/デスクトップ/フォルダー/3.txt','4534v4535v353']]

出力は次のようになります: '/home/user/Desktop/folder/1.txt','93n8nv35732vb9527' パスは同じですが md5 が異なるため

4

2 に答える 2

1

1 行でクレイジーなリストの理解を行うことができます。しかし、とても読みやすいとは思えません。

save_list = [small_list2 for small_list2 in big_list2 for small_list1 in big_list1 if small_list2[0] == small_list1[0] and small_list2[1] != small_list2[1]]

うん…そんなこと書かないでください。:P

とにかく、あなたのコード/アイデアは正しいようですが、サンプル入力なしで実際に検証する方法はありません.

于 2013-09-01T10:28:03.857 に答える
1

small_list1パスが繰り返されておらず、含まれていないと仮定するとsmall_list2(両方のリストに表示されるパスは問題ありません)、辞書を使用する必要があるように思えます。リストのリストの代わりに、[path, md5]パスをチェックサムにマッピングする dicts を作成します。次に、各パスのチェックサムを効率的に検索できます。

path_dict1 = something()
path_dict2 = something_else()
save_list = [(path, md5) for path, md5 in path_dict2.viewitems()
             if md5 != path_dict1.get(path)]

これは、入力リストの長さの積に比例して時間がかかるリストベースのソリューションよりもはるかに高速に実行されます。このソリューションには、パスの数に比例して時間がかかります。

于 2013-09-01T10:33:33.977 に答える