2016-02-05 76 views
0

例子:排序與案例列表

let list = [['aen', '2'], ['ben', '3'], ['Aen', '4'], ['Ben', '5']] 

sort(list, 1) 

輸出:

let list = [['aen', '2'], ['Aen', '4'], ['ben', '3'], ['Ben', '5']] 

預期輸出:

let list = [['Aen', '4'], ['aen', '2'], ['Ben', '5'], ['ben', '3']] 

在Python中,這將是很容易做到,但它似乎沒有TE是可能使用python sorted()命令和vim列表。

如何按預期對列表進行排序?

UPDATE:

也許一個解決辦法是:

for i in range(0,len(list)-1) 
    let @b= join(list[i], "|||") 
endfor 

這將使在寄存器中的所有行,但我怎麼能在一個寄存器中的行排序?

EDIT: 發現一個溶液用蟒的幫助(VIM功能內)

python3 << endpython 
import vim 
list2 = vim.eval('list') 
list3 = sorted(list2, key=lambda v: (v[0].upper(), v[0].islower())) 
vim.command("let list= %s"% list3) 
endpython 

echo list --> [['Aen', '4'], ['aen', '2'], ['Ben', '5'], ['ben', '3']] 

回答

0

sort()有一個可選參數,該參數的函數。根據子列表的第一個元素定義返回-1,0或1的函數。

請注意,您必須爲變更的詞法順序定義函數。

可以改爲將換位版本排序爲tr(),然後在排序後轉回。

+0

請參閱更新。 Btw..is funcref不僅用於比較數字? – Reman

0

我想在python中獲得您的預期結果,您也必須編寫您自己的比較函數。在vim中,你可以先impl。比較函數,並將函數ref傳遞給sort()函數。

請查看詳細

+0

你好肯特。我不知道如何在python命令中導入vim列表。在python中,如果我對'key = s.lower'和'key = itemgetter(0)'的組合沒有錯誤,你可以這樣做。不知道如何在vim中編寫比較函數,我會查閱幫助文件。 python'key = str.lower'中的 – Reman

+0

不會給你想要的東西。 'A a B b'。 – Kent

+1

如果你的問題是如何將變量/列表從py傳遞給vim,你已經提出了另一個問題,並且我發佈了一個答案。也許你可以再次檢查它:http://stackoverflow.com/questions/17656320/using-python-in-vimscript-how-to-export-a-value-from-a-python-script-back-to-vi – Kent

1

再製造檢查:h sort(:發現一個解決方案與Python的幫助(VIM功能內)

python3 << endpython 
import vim 
list2 = vim.eval('list') 
list3 = sorted(list2, key=lambda v: (v[0].upper(), v[0].islower())) 
vim.command("let list= %s"% list3) 
endpython 

echo list --> [['Aen', '4'], ['aen', '2'], ['Ben', '5'], ['ben', '3']]