簡體   English   中英

Python元組字符串列表

[英]Python List of Strings to Tuple Pairs

我遇到一些困難,想出一種有效的方法來獲取字符串列表並將其轉換為元組對。 我有一個類似於的列表:

listOfNames = ['red-l','blue-l','green-s','red-s','blue-s']

此示例中的每種顏色(紅色,藍色和綠色)都有“-l”或“-s”條目或兩者都有。 我需要將這個字符串列表轉換為元組對,例如:

tupleOfNames = [('red-l','red-s'),(None,'green-s'),('blue-l','blue-s')]

我認為需要正則表達式,但我不知道該怎么做。 任何幫助是極大的贊賞。 謝謝

一個可能的解決方案,我們可以先對列表進行排序,然后按每個術語的顏色部分進行分組,並將每個組轉換為元組,如果它只包含一個元素,則在元組中插入一個None:

import re
from itertools import groupby

li = []
listOfNames.sort()
for k, g in groupby(listOfNames, lambda s: re.findall("(.*)-", s)):
    liG = list(g)
    if len(liG) == 1:
        li.append((None, liG[0]))
    else:
        li.append(tuple(liG))

li
# [('blue-l', 'blue-s'), (None, 'green-s'), ('red-l', 'red-s')]

我寫了這個功能遠非完美,但提供了你想要的結果:

  def tupleofnames(listofnames):
        result = []
        colors = set([x[:-2] for x in listOfNames])    
        for c in colors:         
            if c+"-l" in listofnames:
                if c+'-s' in listofnames:
                    result.append((c+"-l",c+'-s'))
                else: 
                    result.append((c+"-l",None))
            else:
                result.append((None,c+"-s"))
        return result

結果如下:

[(None, 'green-s'), ('red-l', 'red-s'), ('blue-l', 'blue-s')]
listOfNames = ['red-l','blue-l','green-s','red-s','blue-s']
l_list = [a[:-2] for a in filter(lambda x:x[-1]=='l',listOfNames)]
s_list = [a[:-2] for a in filter(lambda x:x[-1]=='s',listOfNames)]
s = {a[:-2] for a in listOfNames}
tuplesOfNames = [tuple([c+'-l' if c in l_list else None,c+'-s' if c in s_list else None]) for c in s]

輸出:

[('blue-l', 'blue-s'), ('red-l', 'red-s'), (None, 'green-s')]

由於分成2個單獨的元素列表,因此這將比其他選項略快,因此查找速度更快。

我認為一個不錯的(也許是更好的)解決方案是:

from collections import defaultdict
d = defaultdict(list)
listOfNames = ['red-l','blue-l','green-s','red-s','blue-s']
# Go over the list and remember for each color the entry 
for s in listOfNames:
   d[s[:-2]].append(s[-1])
# Go over the colors and produce the appropriate tuple
[ (key+'-l' if 'l' in d[key] else None, key+'-s' if 's' in d[key] else None) for key in d.keys() ]

那輸出:

[('blue-l', 'blue-s'), ('red-l', 'red-s'), (None, 'green-s')]

使用該方法,您只需在原始列表上進行一次,在顏色鍵上進行一次(較小)。

對字典的訪問平均為O(1) ,因此應該足夠快。

查看itertools.product()函數。 這將返回兩個列表的笛卡爾積。 在你的情況下,你可以做到,

from itertools import product

l_names = ['red-l', 'blue-l']
s_names = ['red-s', 'blue-s', 'green-s']

tupleOfNames = list(product(l_names, s_names))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM