根据列表中的字符串创建包含元组的新列表

时间:2017-11-14 18:41:41

标签: python list tuples

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"人与12配对。因此,它在元组中有一个1, 2列表。我获得上述结果的方法是将L[1]中的第一个字符与列表末尾进行比较。如果L[1]中的第一个字母与L[2]中的第一个字母匹配,则会将L[2]中的第二个字母与L[1]中的第二个字母捆绑在一起。最后,新列表与元组中的0配对。顺便说一句,我不能拿出能检查字符串中第一个字母的东西。我不确定这种方法是否正确。

我正努力在上面列出L1这样的列表。如果我对这个问题的处理方法是对的,有人能告诉我吗?如果错了,请给我一个提示来解决这个问题。

5 个答案:

答案 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)

或适用于的版本:

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])]