使用集合中的for循环填充字典



我有两个字符串:

s1 = "Are they here"
s2 = "yes, they are here"

我想创建一个字典(e(,它的关键字是每个共享元素在包含它最多的字符串中出现的最大次数,值是元素(即"y"在s1中包含一次,在s2中包含两次(。因此,我想要一条格言:

e =  {2:y} # and so on

为了描述我的代码,我想创建一个包含所有共享元素的列表(c(:

c = ['r', 'e', 't', 'h', 'e', 'y', 'h', 'e', 'r', 'e', 'y', 'e', 't', 'h', 'e', 'y', 'r', 'e', 'h', 'e', 'r', 'e']

然后将其切换到一个集合以消除重复并将其用作迭代器:

d = {'h', 'y', 'r', 't', 'e'}

最终,我想到了使用for循环来填充dict(e(,方法是迭代d中的每个元素并报告它出现的最大次数。

这是我的完整代码请注意,我不想使用任何库。还要注意,该代码与dict理解一起工作:

def mix(s1, s2):
c = []                      # create a var to be filled with all shared chars
for i in s1:
if i != " ":
if i in s2:
c.append(i)
for i in s2:
if i != " ":
if i in s1:
c.append(i)     # end of 1st process
d = set(c)                  # remove duplicates
e = {}                      # create a dict to align counting and relative char
for i in d:
a = s1.count(i)
b = s2.count(i)
m = max(a, b)
e[m] = i

# z = {i:max(s1.count(i), s2.count(i)) for i in d} this is what actually works

return e # z works instead

我得到的问题是for循环在3次迭代后停止。

编辑:我看到Rakshith Bs对我的评论做了更好的版本,请参阅thiers。

首先我会说我是一个业余爱好者,下面的内容完全可以简化。

首先,决定资本化,A!=a、 使用CCD_ 1或CCD_。

其次,将字典切换为{'letter':count}会使一切变得更容易。

然后,创建两个字典来计算每个字符串中的唯一字母可能会更容易。

d1 = {}
s1 = s1.lower()
for letter in s1:
if letter != " ":
if letter in d1:
d1[letter] += 1 # if in dict, add one to count
else:
d1[letter] = 1 #add new letter to dict

d2 = {}
s2 = s2.lower()
for letter in s2:
if letter != " ":
if letter in d2:
d2[letter] += 1 # if in dict, add one to count
else:
d2[letter] = 1 #add new letter to dict

这应该制作两个字典,for循环它来比较和附加最大值(这部分可以更有效地制作(。

d3 = {}
for let in d1:
if let not in d2:
d3[let] = d1.get(let)
if let in d2:
if d1[let] >= d2[let]:
d3[let] = d1.get(let)
else:
d3[let] = d2.get(let)
for let in d2:
if let not in d1:
d3[let] = d2.get(let)
del d3[',']

这至少会让你走上正轨。

我刚刚意识到,集合显然可以有UNIQUE值作为键,所以,我的代码当然会显示"部分地";。

当它得到相同的密钥时,它会覆盖它。

因此,使用元素作为密钥将起作用,for循环可以是这样的:

for i in d:
a = s1.count(i)
b = s2.count(i)
m = max(a, b)
e[i] = m
def mix(s1, s2):
dict1 = dict()
dict2 = dict()
for i in s1:
if i != " " and i != ",":
if i in dict1:
dict1[i] += 1
else:
dict1[i] = 1
for i in s2:
if i != " " and i != ",":
if i in dict2:
dict2[i] += 1
else:
dict2[i] = 1
# print(dict1)
# print(dict2)
for key, value in dict2.items():
if key in dict1:
# print(f' check {key}, {value}')
if value >= dict1[key]:
dict1[key] = value
else:
dict1[key] = value
#print(f' create {key}, {value}')
return {v: k for k, v in dict1.items()} #inverted 

s1 = "eeeeaaabbbcccc"
s2 = "eeeeeaaa"
print(mix(s1, s2))

为什么要创建合并列表并根据计数器集重新检查

在这里,我比较了dict1(即s1(和dict2(再次为s2(的值,如果值高,则重写dict1;否则,如果找不到,则将其指定为最高

输出:

{'e':5,'a':3,'b':3、'c':4}

{5: 'e', 3: 'b', 4: 'c'}

这可能最终被覆盖,因为"a"被"b"覆盖

最新更新