如何在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