我有一个字符串列表如下:
["A TB", "A-R TB", "B TB", "B-R TB", "C TB", "C-R TB" ...]
但字符串的顺序是随机的。如何编写一个将元素配对的函数,使输出如下:
[["A TB", "A-R TB"], ["B TB", "B-R TB"], ["C TB", "C-R TB"] ...]
答案 0 :(得分:2)
您可以按字典顺序对列表进行排序,然后成对读取:
def grouped(lst):
i = iter(sorted(lst))
return list(zip(i, i))
另一种方法是使用itertools.groupby()
:
def grouped(lst):
return [list(g) for k, g in groupby(sorted(lst), lambda x: x[0])]
这样你就可以拥有任意大小的组。
答案 1 :(得分:1)
您可以在不使用'-R'
的情况下按字符串对字符串进行分组。然后,您可以构建所需的列表。
import re, collections
xs = ["A TB", "A-R TB", "B TB", "B-R TB", "C TB", "C -R TB"]
occurences = collections.defaultdict(list)
exp = re.compile(' *-R')
for x in xs:
occurences[exp.sub('', x)].append(x)
res = list(occurences.values())
print(res)
# [['A TB', 'A-R TB'], ['B TB', 'B-R TB'], ['C TB', 'C -R TB']]
答案 2 :(得分:0)
我使用了您的具体输入。如果输入更通用,请告诉我。
def part(l):
result = []
has_r = sorted([item for item in l if "-R" in item])
no_r = sorted([item for item in l if "-R" not in item])
for r, no_r in zip(has_r, no_r):
if r.replace("-R", "") == no_r:
result.append([no_r, r])
return result
结果:
inp = ["A TB", "A-R TB", "B TB", "B-R TB", "C TB", "C-R TB"]
print(part(inp))
[['A TB', 'A-R TB'], ['B TB', 'B-R TB'], ['C TB', 'C-R TB']]
答案 3 :(得分:0)
如果你不关心订单而只想根据第一个字母对它们进行分组(因为不清楚):
from collections import defaultdict
a = ["A TB", "A-R TB", "B TB", "B-R TB", "C TB", "C -R TB"]
b = defaultdict(list)
c = []
for x in a:
b[x[0]].append(x)
for x in b.values():
c.append(x)
print(c)
# [['C -R TB', 'C TB'], ['B TB', 'B-R TB'], ['A TB', 'A-R TB']]
答案 4 :(得分:-1)
一种方法,但绝对不是唯一的方法是按前两个字母对列表进行排序,然后采用两个元素对。像这样:
ino = ["A TB", "A-R TB", "B TB", "B-R TB", "C TB", "C -R TB"]
ina = sorted(into, key=lambda x: x[0:1])
out = list(zip(ina, ina[1:]))[0::2]
print(out)
# Shows [('A TB', 'A-R TB'), ('B TB', 'B-R TB'), ('C TB', 'C -R TB')]
我假设流中只有一对出现。但是,如果还有更多,那就会崩溃。
魔术线是out = list(zip(ina, ina[1:]))[0::2]
。它的作用是将原始列表中的每个元素与原始列表配对但没有它的头部。所以我们得到一个迭代器,其中第一个元素与第二个元素配对,第二个元素与第三个元素配对,第三个元素与第四个元素等配对。我们只对偶数元素感兴趣,即第一个元素与第二个,第三个元素使用第四个等,所以我们使用[0::2]
来选择0
到最后的所有其他元素。