如何在dict python 3.4中查找值列表中的第一个唯一项

如何在dict python 3.4中查找值列表中的第一个唯一项,python,Python,大家好,我有一本字典 dat = { '2018-01':['jack', 'jhon','mary','mary','jack'], '2018-02':['Oliver', 'Connor','mary','Liam','jack','Oliver'], '2018-03':['Jacob', 'jhon','Reece','mary','jack'], '2018-04':['George', 'jhon','mary','Alexa

大家好,我有一本字典

dat = {
       '2018-01':['jack', 'jhon','mary','mary','jack'],
       '2018-02':['Oliver', 'Connor','mary','Liam','jack','Oliver'],
       '2018-03':['Jacob', 'jhon','Reece','mary','jack'],
       '2018-04':['George', 'jhon','mary','Alexander','Richard'],
}
我希望输出如下:

    Output = {
              '2018-01':['jack','jhon','mary'],
              '2018-02':['Oliver', 'Connor','Liam'],
              '2018-03':['Jacob','Reece'],
              '2018-04':['George','Alexander','Richard'] 
}
d = {'2018-01': ['jack', 'jhon', 'mary', 'mary', 'jack'],
     '2018-02': ['Oliver', 'Connor', 'mary', 'Liam', 'jack', 'Oliver'],
     '2018-03': ['Jacob', 'jhon', 'Reece', 'mary', 'jack'],
     '2018-04': ['George', 'jhon', 'mary', 'Alexander', 'Richard']}

result = {}
found = set()
for i in sorted(d):
    result[i] = list(set(d[i]).difference(found))
    found.update(d[i])

for i in sorted(result):
     print(i, result[i])
l=[]
for k,v in dat.items():
    dat[k] = list(set([i for i in v if i not in l]))
    l = l + v
我有我的代码,它是一个嵌套的for循环,将其插入到列表中

lis = []
for key,value in dat.iteritems():   
    for va in value:
        if va not in lis:
            val = key,va
            lis.append(val)
但是我的dict“dat”在列表中的值中有很多项。我怎样才能在没有嵌套for循环的情况下完成这项工作呢?因为它会占用很多时间


提前感谢

您要做的是:

dat = {
       '2018-01':['jack', 'jhon','mary','mary','jack'],
       '2018-02':['Oliver', 'Connor','mary','Liam','jack','Oliver'],
       '2018-03':['Jacob', 'jhon','Reece','mary','jack'],
       '2018-04':['George', 'jhon','mary','Alexander','Richard'],
}

unique = set()
res = {}
for key, values in dat.items():
    res[key] = []
    for value in values:
        if value not in unique:
            res[key].append(value)
            unique.add(value)
产生:

{'2018-01': ['jack', 'jhon', 'mary'], 
 '2018-02': ['Oliver', 'Connor', 'Liam'], 
 '2018-03': ['Jacob', 'Reece'], 
 '2018-04': ['George', 'Alexander', 'Richard']}

但是 Python版本3.7之前的词典中的顺序无法保证,这使得上述代码非常危险。原因是,对于相同的输入,您可能最终会有多个不同的输出

要了解原因,请查看以下内容:

list1 = ['foo', 'bar', 'foobar']
list2 = ['bar']
  • 如果我使用
    list1
    消除所有重复项,我将得到:

    list1 = ['foo', 'bar', 'foobar']
    list2 = []
    
    list1 = ['foo', 'foobar']
    list2 = ['bar']
    
  • 如果我使用
    list2
    消除所有重复项,我将得到:

    list1 = ['foo', 'bar', 'foobar']
    list2 = []
    
    list1 = ['foo', 'foobar']
    list2 = ['bar']
    
  • 因此,根据我从什么开始,我最终会得到不同的结果。根据您的示例中的
    dict
    ,您开始使用的
    list
    是任何人的猜测


    然而,仍有希望 因为您可以使用
    OrderedDict
    (从
    集合
    )开始


    然后像以前一样继续执行其余的代码。

    您要做的是:

    dat = {
           '2018-01':['jack', 'jhon','mary','mary','jack'],
           '2018-02':['Oliver', 'Connor','mary','Liam','jack','Oliver'],
           '2018-03':['Jacob', 'jhon','Reece','mary','jack'],
           '2018-04':['George', 'jhon','mary','Alexander','Richard'],
    }
    
    unique = set()
    res = {}
    for key, values in dat.items():
        res[key] = []
        for value in values:
            if value not in unique:
                res[key].append(value)
                unique.add(value)
    
    产生:

    {'2018-01': ['jack', 'jhon', 'mary'], 
     '2018-02': ['Oliver', 'Connor', 'Liam'], 
     '2018-03': ['Jacob', 'Reece'], 
     '2018-04': ['George', 'Alexander', 'Richard']}
    

    但是 Python版本3.7之前的词典中的顺序无法保证,这使得上述代码非常危险。原因是,对于相同的输入,您可能最终会有多个不同的输出

    要了解原因,请查看以下内容:

    list1 = ['foo', 'bar', 'foobar']
    list2 = ['bar']
    
  • 如果我使用
    list1
    消除所有重复项,我将得到:

    list1 = ['foo', 'bar', 'foobar']
    list2 = []
    
    list1 = ['foo', 'foobar']
    list2 = ['bar']
    
  • 如果我使用
    list2
    消除所有重复项,我将得到:

    list1 = ['foo', 'bar', 'foobar']
    list2 = []
    
    list1 = ['foo', 'foobar']
    list2 = ['bar']
    
  • 因此,根据我从什么开始,我最终会得到不同的结果。根据您的示例中的
    dict
    ,您开始使用的
    list
    是任何人的猜测


    然而,仍有希望 因为您可以使用
    OrderedDict
    (从
    集合
    )开始


    然后像以前一样继续执行其余代码。

    如果您不介意值列表中的顺序,这可能是一个解决方案。 注意,根据Python的版本,此解决方案的输出可能会有所不同。事实上,dict保证只从Python3.6中订购

    dat = {
    '2018-01': ['jack', 'jhon', 'mary', 'mary', 'jack'],
    '2018-02': ['Oliver', 'Connor', 'mary', 'Liam', 'jack', 'Oliver'],
    '2018-03': ['Jacob', 'jhon', 'Reece', 'mary', 'jack'],
    '2018-04': ['George', 'jhon', 'mary', 'Alexander', 'Richard'],
    }
    
    s = set()
    d = {}
    for k,v in dat.items():
        d[k] = list(set(v) - s)
        s.update(d[k])
    
    #{'2018-01': ['jack', 'jhon', 'mary'], '2018-02': ['Connor', 'Oliver', 'Liam'], '2018-03': ['Reece', 'Jacob'], '2018-04': ['Richard', 'Alexander', 'George']}
    

    如果您不介意值列表中的顺序,这可能是一个解决方案。 注意,根据Python的版本,此解决方案的输出可能会有所不同。事实上,dict保证只从Python3.6中订购

    dat = {
    '2018-01': ['jack', 'jhon', 'mary', 'mary', 'jack'],
    '2018-02': ['Oliver', 'Connor', 'mary', 'Liam', 'jack', 'Oliver'],
    '2018-03': ['Jacob', 'jhon', 'Reece', 'mary', 'jack'],
    '2018-04': ['George', 'jhon', 'mary', 'Alexander', 'Richard'],
    }
    
    s = set()
    d = {}
    for k,v in dat.items():
        d[k] = list(set(v) - s)
        s.update(d[k])
    
    #{'2018-01': ['jack', 'jhon', 'mary'], '2018-02': ['Connor', 'Oliver', 'Liam'], '2018-03': ['Reece', 'Jacob'], '2018-04': ['Richard', 'Alexander', 'George']}
    

    我想你需要的是,我只是编辑你的代码

    dat = {
           '2018-01':['jack', 'jhon','mary','mary','jack'],
           '2018-02':['Oliver', 'Connor','mary','Liam','jack','Oliver'],
           '2018-03':['Jacob', 'jhon','Reece','mary','jack'],
           '2018-04':['George', 'jhon','mary','Alexander','Richard'],
    }
    
    lis= dat.values()
    lis = list(set([item for sublist in lis for item in sublist]))
    out_val = []
    for key,value in dat.iteritems():   
        res = []
        for i in value :
            if i in lis :
                res.append(i)
                lis.remove(i)
        out_val.append(res)
    
    your_output=dict(zip( dat.keys(), out_val))
    
    输出:

    {'2018-01': ['jack', 'jhon', 'mary'], 
    '2018-03': ['Jacob', 'Reece'], 
    '2018-02': ['Oliver', 'Connor', 'Liam'], 
    '2018-04': ['George', 'Alexander', 'Richard']}
    

    我想你需要的是,我只是编辑你的代码

    dat = {
           '2018-01':['jack', 'jhon','mary','mary','jack'],
           '2018-02':['Oliver', 'Connor','mary','Liam','jack','Oliver'],
           '2018-03':['Jacob', 'jhon','Reece','mary','jack'],
           '2018-04':['George', 'jhon','mary','Alexander','Richard'],
    }
    
    lis= dat.values()
    lis = list(set([item for sublist in lis for item in sublist]))
    out_val = []
    for key,value in dat.iteritems():   
        res = []
        for i in value :
            if i in lis :
                res.append(i)
                lis.remove(i)
        out_val.append(res)
    
    your_output=dict(zip( dat.keys(), out_val))
    
    输出:

    {'2018-01': ['jack', 'jhon', 'mary'], 
    '2018-03': ['Jacob', 'Reece'], 
    '2018-02': ['Oliver', 'Connor', 'Liam'], 
    '2018-04': ['George', 'Alexander', 'Richard']}
    

    假设顺序是按键的
    ['2018-01'、'2018-02'、'2018-03'、'2018-04']
    您可以按该顺序循环键,如下所示:

        Output = {
                  '2018-01':['jack','jhon','mary'],
                  '2018-02':['Oliver', 'Connor','Liam'],
                  '2018-03':['Jacob','Reece'],
                  '2018-04':['George','Alexander','Richard'] 
    }
    
    d = {'2018-01': ['jack', 'jhon', 'mary', 'mary', 'jack'],
         '2018-02': ['Oliver', 'Connor', 'mary', 'Liam', 'jack', 'Oliver'],
         '2018-03': ['Jacob', 'jhon', 'Reece', 'mary', 'jack'],
         '2018-04': ['George', 'jhon', 'mary', 'Alexander', 'Richard']}
    
    result = {}
    found = set()
    for i in sorted(d):
        result[i] = list(set(d[i]).difference(found))
        found.update(d[i])
    
    for i in sorted(result):
         print(i, result[i])
    
    l=[]
    for k,v in dat.items():
        dat[k] = list(set([i for i in v if i not in l]))
        l = l + v
    
    输出

    2018-01 ['mary', 'jhon', 'jack']
    2018-02 ['Oliver', 'Liam', 'Connor']
    2018-03 ['Reece', 'Jacob']
    2018-04 ['Alexander', 'Richard', 'George']
    

    假设顺序是按键的
    ['2018-01'、'2018-02'、'2018-03'、'2018-04']
    您可以按该顺序循环键,如下所示:

        Output = {
                  '2018-01':['jack','jhon','mary'],
                  '2018-02':['Oliver', 'Connor','Liam'],
                  '2018-03':['Jacob','Reece'],
                  '2018-04':['George','Alexander','Richard'] 
    }
    
    d = {'2018-01': ['jack', 'jhon', 'mary', 'mary', 'jack'],
         '2018-02': ['Oliver', 'Connor', 'mary', 'Liam', 'jack', 'Oliver'],
         '2018-03': ['Jacob', 'jhon', 'Reece', 'mary', 'jack'],
         '2018-04': ['George', 'jhon', 'mary', 'Alexander', 'Richard']}
    
    result = {}
    found = set()
    for i in sorted(d):
        result[i] = list(set(d[i]).difference(found))
        found.update(d[i])
    
    for i in sorted(result):
         print(i, result[i])
    
    l=[]
    for k,v in dat.items():
        dat[k] = list(set([i for i in v if i not in l]))
        l = l + v
    
    输出

    2018-01 ['mary', 'jhon', 'jack']
    2018-02 ['Oliver', 'Liam', 'Connor']
    2018-03 ['Reece', 'Jacob']
    2018-04 ['Alexander', 'Richard', 'George']
    

    对@Ev的另一种看法。Kounis使用集合和
    OrderedDict
    (和
    pprint
    )的方法,以实现漂亮的打印效果:


    对@Ev的另一种看法。Kounis使用集合和
    OrderedDict
    (和
    pprint
    )的方法,以实现漂亮的打印效果:

    试试这个

    tmp_list1 = []
    
    for key,value in dat.iteritems():
    
        tmp_list2 = []
    
        dat[key] = list(set(value))
    
        for val in dat[key]:
    
            if val not in tmp_list1:
    
                tmp_list2.append(val)
    
        dat[key] = tmp_list2
    
        tmp_list1 = tmp_list1 + tmp_list2
    
    print dat
    
    试试这个

    tmp_list1 = []
    
    for key,value in dat.iteritems():
    
        tmp_list2 = []
    
        dat[key] = list(set(value))
    
        for val in dat[key]:
    
            if val not in tmp_list1:
    
                tmp_list2.append(val)
    
        dat[key] = tmp_list2
    
        tmp_list1 = tmp_list1 + tmp_list2
    
    print dat
    

    您可以这样做:

        Output = {
                  '2018-01':['jack','jhon','mary'],
                  '2018-02':['Oliver', 'Connor','Liam'],
                  '2018-03':['Jacob','Reece'],
                  '2018-04':['George','Alexander','Richard'] 
    }
    
    d = {'2018-01': ['jack', 'jhon', 'mary', 'mary', 'jack'],
         '2018-02': ['Oliver', 'Connor', 'mary', 'Liam', 'jack', 'Oliver'],
         '2018-03': ['Jacob', 'jhon', 'Reece', 'mary', 'jack'],
         '2018-04': ['George', 'jhon', 'mary', 'Alexander', 'Richard']}
    
    result = {}
    found = set()
    for i in sorted(d):
        result[i] = list(set(d[i]).difference(found))
        found.update(d[i])
    
    for i in sorted(result):
         print(i, result[i])
    
    l=[]
    for k,v in dat.items():
        dat[k] = list(set([i for i in v if i not in l]))
        l = l + v
    
    现在
    dat
    将是:

    {
        '2018-01': ['jhon', 'mary', 'jack'],
        '2018-02': ['Oliver', 'Liam', 'Connor'],
        '2018-03': ['Jacob', 'Reece'],
        '2018-04': ['George', 'Alexander', 'Richard']
    }
    

    您可以这样做:

        Output = {
                  '2018-01':['jack','jhon','mary'],
                  '2018-02':['Oliver', 'Connor','Liam'],
                  '2018-03':['Jacob','Reece'],
                  '2018-04':['George','Alexander','Richard'] 
    }
    
    d = {'2018-01': ['jack', 'jhon', 'mary', 'mary', 'jack'],
         '2018-02': ['Oliver', 'Connor', 'mary', 'Liam', 'jack', 'Oliver'],
         '2018-03': ['Jacob', 'jhon', 'Reece', 'mary', 'jack'],
         '2018-04': ['George', 'jhon', 'mary', 'Alexander', 'Richard']}
    
    result = {}
    found = set()
    for i in sorted(d):
        result[i] = list(set(d[i]).difference(found))
        found.update(d[i])
    
    for i in sorted(result):
         print(i, result[i])
    
    l=[]
    for k,v in dat.items():
        dat[k] = list(set([i for i in v if i not in l]))
        l = l + v
    
    现在
    dat
    将是:

    {
        '2018-01': ['jhon', 'mary', 'jack'],
        '2018-02': ['Oliver', 'Liam', 'Connor'],
        '2018-03': ['Jacob', 'Reece'],
        '2018-04': ['George', 'Alexander', 'Richard']
    }
    


    在3.7之前的Python版本中,这不能以唯一的方式完成,因为在3.7之前的版本中,字典中的顺序是有保证的。你用的是什么版本?您是否在dict中假定了顺序?\EDIT:从
    iteritems
    判断,您正在使用Python 2.7,因此您尝试的操作无法以可复制的方式完成。@Ev.Kounis orderedict?将
    dat
    转换为
    orderedict
    也是任意的。我们必须从一个
    OrderedDict
    开始。为什么
    Oliver
    会在期望的输出中出现两次?这在3.7之前的Python版本中是不可能以唯一的方式实现的,在3.7之前的版本中,字典中的顺序是有保证的。你用的是什么版本?您是否在dict中假定了顺序?\EDIT:从
    iteritems
    判断,您正在使用Python 2.7,因此您尝试的操作无法以可复制的方式完成。@Ev.Kounis orderedict?将
    dat
    转换为
    orderedict
    也是任意的。你必须从一个
    OrderedDict
    开始。为什么
    Oliver
    在期望的输出中出现了两次?您好,谢谢您的回答,我正在使用python 3.4 X当您在问题中发布的代码(顺便说一句,它返回一个列表,而不是dict)没有运行时,由于在Python3中dicts没有
    iteritems
    ,我的意思是我只是粘贴了一个片段,但我正在寻找一个dicts,如果你不想更改
    dat
    的格式,你可以编写
    ordered_-dat=OrderedDict(sorted(dat.items())
    ,然后调用第一行
    作为键,ordered_-dat.items()中的值:
    。因此,如果您已经编写了dat,则无需手动更改它。您好,谢谢您的回答,我正在使用python 3.4 XT当您在问题中发布的代码(顺便说一句,它返回的是列表,而不是dict)没有运行时,由于在Python3中dicts没有
    iteritems
    ,我的意思是我只是粘贴了一个片段,但我正在寻找一个dicts,如果你不想更改
    dat
    的格式,你可以编写
    ordered_-dat=OrderedDict(sorted(dat.items())
    ,然后调用第一行
    作为键,ordered_-dat.items()中的值:
    。因此,如果您已经编写了dat,则不需要手动更改dat。我是否应该将dic转换为有序dic