2014-01-26 64 views
1

我難倒,任何幫助將是巨大的字符串(列表),這是遠高於我的工資等級:的Python:重新排序基於以前的列表順序

我有鑑定提供當鍵值串一個號碼。更復雜的是,它們被識別爲int或字符串。

目的是當一個新的字符串被處理時,它應該使用先前定義的原始鍵順序。此外,該值可以總是不同

這裏是從第一個字符串中獲得的信息的示例:

import re 
int_dict = {} 
string_dict = {} 
int_number = 1 
string_number = 1 
firstlist = "key_a=apples key_z=4 key_e=pears key_b=bananas key_r=3" 
re_result = re.findall(r'(\w+)=(\w+)', firstlist) 
for i in re_result: 
    if i[1].isdigit(): 
     int_dict[int_number] = i[0] 
     int_number += 1 
    else: 
     string_dict[string_number] = i[0] 
     string_number += 1 

print int_dict 
>>> {1: 'key_z', 2: 'key_r'} 
print string_dict 
>>> {1: 'key_a', 2: 'key_e', 3: 'key_b'} 

第二行可能如下:

secondstring = "key_r=54 key_a=grapes key_b=nuts key_z=7 key_r=22" 

我想字符串基於前一個字符串重新排序,在第二個字符串中還有一個新的鍵,它應該根據它的int或字符串是否取下一個增量:

secondstring_reordered = "key_a=grapes key_z=7 key_b=nuts key_r=22 key_z=7" 
+1

你想通過執行此操作來完成什麼? – roippi

+0

一種模式數據庫,它構建了以前未知密鑰的知識,並且如果密鑰是通用的,它將始終放入數據庫中的正確列中,而不管它在字符串中的位置。 – dtalbot

回答

1

使用第一個字符串創建字典第一,其中關鍵是從字符串和價值,關鍵是現在使用這本詞典可以排序返回的列表中該項目的指數firstlist.split()

>>> d = {item.split('=', 1)[0]:i for i, item in enumerate(firstlist.split())} 
>>> d 
{'key_e': 2, 'key_b': 3, 'key_a': 0, 'key_r': 4, 'key_z': 1} 

該列表由secondstring.split()返回,然後再加入回用str.join

>>> ' '.join(sorted((item for item in secondstring.split()), 
               key=lambda x:d[x.split('=',1)[0]])) 
'key_a=grapes key_z=7 key_b=nuts key_r=54 key_r=22' 

如果你確定該字符串的值12/112版本包含=,那麼您可以分別將item.split('=', 1)x.split('=',1)[0]更改爲item.split('=')[1]x.split('=')[1]

+0

感謝您的幫助,這在原則上是有效的,但它沒有考慮可能引入到第二個字符串中的新密鑰。另外,它是否考慮到它們的鍵可能是int或字符串的事實? – dtalbot

+0

@dtalbot如果第二個字符串包含可能不在第一個字符串中的鍵,那麼在排序過程中使用'lambda x:d.get(x.split('=',1)[0],default_value)'作爲鍵,其中'default_value'可以是任何你想用於比較的值。 –

+0

所以你說的是,在這種情況下,default_value是引入的新值?我會如何寫它? – dtalbot