L = ["5", "0 1", "0 2", "1 3", "2 3", "2 4", "3 4"]
每个数字代表一个人。因此,列表中有5个人从0到4。 L[0]
始终显示列表中有多少人。
L1 = [(0,[1,2]), (1, [3]), (2, [3,4]), (3, [4])]
"0"
人与1
和2
配对。因此,它在元组中有一个1, 2
列表。我获得上述结果的方法是将L[1]
中的第一个字符与列表末尾进行比较。如果L[1]
中的第一个字母与L[2]
中的第一个字母匹配,则会将L[2]
中的第二个字母与L[1]
中的第二个字母捆绑在一起。最后,新列表与元组中的0
配对。顺便说一句,我不能拿出能检查字符串中第一个字母的东西。我不确定这种方法是否正确。
我正努力在上面列出L1
这样的列表。如果我对这个问题的处理方法是对的,有人能告诉我吗?如果错了,请给我一个提示来解决这个问题。
答案 0 :(得分:1)
使用列表理解
考虑L[0]
使用startswith
L = ["5", "0 1", "0 2", "1 3", "2 3", "2 4", "3 4"]
L1 = [(0,[1,2]), (1, [3]), (2, [3,4]), (3, [4])] # required list
L2 = [ (i, [ int(x[-1]) for x in L if str(x).startswith(str(i)) ]) for i in range(int(L[0])-1) ]
输出
[(0, [1, 2]), (1, [3]), (2, [3, 4]), (3, [4])]
[(0, [1, 2]), (1, [3]), (2, [3, 4]), (3, [4])]
答案 1 :(得分:0)
最好的办法是首先使用defaultdict
:
from collections import defaultdict
from itertools import islice
result = defaultdict(list)
for li in islice(L,1,None):
h, *others = map(int,li.split())
for other in others:
result[h].append(other)
或适用于python-2.x的版本:
from collections import defaultdict
from itertools import islice
result = defaultdict(list)
for li in islice(L,1,None):
data = map(int,li.split())
h = data[0]
for other in data[1:]:
result[h].append(other)
然后我们获得该词典的items
:
L1 = list(result.items())
这会产生:
>>> L1
[(0, [1, 2]), (1, [3]), (2, [3, 4]), (3, [4])]
请注意,在这种情况下,项目不有序:因为Python中的字典通常没有顺序(CPython中的最新实现具有,但这被视为实现细节)。
但是将字典转换回列表是不合逻辑的,因为字典的优点是快速查找(在 O(1),常量时间)。
我们可以通过写作来使最后一部分变得更优雅:
from collections import defaultdict
result = defaultdict(list)
for li in islice(L,1,None):
h, *others = map(int,li.split())
result[h] += others
答案 2 :(得分:0)
而不是列表,使用dict并使用此模式而不导入任何外部模块。
L = ["5", "0 1", "0 2", "1 3", "2 3", "2 4", "3 4"]
final_dict={}
new=[]
for item in L:
if not len(item)<2:
if int(item[0]) not in final_dict:
final_dict[int(item[0])]=[int(item[2])]
else:
final_dict[int(item[0])].append(int(item[2]))
print(final_dict)
输出:
{0: [1, 2], 1: [3], 2: [3, 4], 3: [4]}
或者如果你想在列表中得到结果,那么在上面的代码中加上这一行:
print([(key,value) for key,value in final_dict.items()])
输出:
[(0, [1, 2]), (1, [3]), (2, [3, 4]), (3, [4])]
答案 3 :(得分:0)
我建议您使用dictionary
形式,以便以后更轻松地处理数据。所以在这里,defualtdict
最好用。
>>> from collections import defaultdict
>>> L = ["5", "0 1", "0 2", "1 3", "2 3", "2 4", "3 4"]
>>> n = int(L.pop(0)) #number of people
>>> d = defaultdict(list)
>>> for ele in L:
x, y = map(int, ele.split())
d[x].append(y)
>>> d
=> defaultdict(<class 'list'>, {0: [1, 2], 1: [3], 2: [3, 4], 3: [4]})
如果需要list
格式,请使用dict.items()
并输入list
>>> l1 = list(d.items())
>>> l1
=> [(0, [1, 2]), (1, [3]), (2, [3, 4]), (3, [4])]
答案 4 :(得分:0)
这是一个itertools.groupy
解决方案。 (注释掉的行也考虑了反向对。)
import itertools as it
import operator as op
def L1(L):
# split pairs
L = [p.split() for p in L[1:]]
# convert to int
L = [(int(P1), int(P2)) for P1, P2 in L]
LL = sorted(L)
# # add reversed and sort
# LL = sorted(L + [P[::-1] for P in L])
# group by first element
res = it.groupby(LL, op.itemgetter(0))
# make proper lists
return [(k, [P[1] for P in v]) for k, v in res]
输出(例如L
):
[(0, [1, 2]), (1, [3]), (2, [3, 4]), (3, [4])]