1
Enying 2021-03-20 10:16:46 +08:00 via Android 2
说实话,看不下去…
|
2
Pagliacii 2021-03-20 10:58:05 +08:00
没看懂想比较啥,但是竖向输出可以简单写成这样: https://i.loli.net/2021/03/20/BRiEovm5lsdFjV9.png
|
4
hellogitooxx OP |
5
hellogitooxx OP 首先感谢 @Pagliacii 的回答,按他的代码,已经完成了编排,
前面是我表达不清,不好意思,如下 A,A,B,B,A,A,A,C,A,A,A,A A,A,B,C,B,A,A,A,B,C,B,E A,B,A,A,C,A,A,A,B,B,A A,B,B,B,A,A,A,A,B,A,A B,A,B,D,B,A,C,A,C,B,A A,B,B,B,B,C,B,A,C,B,B 需求: 元素已经编排好了,然后选择第一行前面的 3 个元素,和后面 5 行前面三个元素对比,有相同的+1,如第一行和第二行有相同的,则+1,行与行之间相互不断比较,到第 4 行和第 6 行也有相同的,也+1,不过这个+1 不是在第一行和第二行的前提上+1,因为它们的内部元素不相等的,然后继续循环,又回到第一行,取前面 4 个元素,相互比较,第 4 行和第 6 行也有相同的相同元素出现+1,循环,后面取前面 5 个元素,又一次循环,发现没有相同元素,程序结束。 想得到的信息: 第一和第二行,有相同的,出现一次 第四和第六行,有相同的,出现二次 恳请赐教。 |
6
Pagliacii 2021-03-20 18:37:09 +08:00 1
@hellogitooxx #5 有三个问题。
1. 相同元素是指字符相同即可,还是要位置相符? 2. 是每行都和其他行比较一次,还是相邻的两行作比较? 3. 取前面的元素作比较,元素的个数是从 3 到 5 即可,还是要到行尾? |
7
drinkeroftea 2021-03-20 19:38:07 +08:00 1
result = dict()
for i in range(len(str_list)): for j in range(i+1, len(str_list)): count = 0 for p in range(3, len(str_list[i])): if str_list[i][:p] == str_list[j][:p]: count += 1 else: break result[str(i)+'_'+str(j)] = count 也不知道有没有读懂你的题干 |
8
hellogitooxx OP @Pagliacii 感谢你的回复,
1.就是相同的元素字符即可,比如第一行 AAB,第二行也是 AAB,第四行 A,B,B 和第 6 行 A,B,B, 2.是每行都和其他行比较一次,存在相同就+1, 3.取前面的元素作比较(从第 3 个元素开始),每循环一次就增加一个元素进行相互比较,直到不存在相同的两行为止。 暂时还发不了图片网址,见谅。 @drinkeroftea 感谢你的热心回复,你可以看看 5 楼我的回复。 |
9
hellogitooxx OP @drinkeroftea 你可以贴张图你的代码运行后的结果么,我再详细描述一下
|
10
Pagliacii 2021-03-20 20:35:18 +08:00 1
|
11
hellogitooxx OP @Pagliacii 是的,每行相同位置的字符要相同。
“从第 3 个元素开始” 是指前两个元素不用管。 |
12
Pagliacii 2021-03-21 00:04:43 +08:00
|
13
Pagliacii 2021-03-21 00:06:53 +08:00 1
@Pagliacii #12 贴错图了,应该是这张: https://i.loli.net/2021/03/21/XxYQLNKiWzylmTa.png
|
14
hellogitooxx OP @Pagliacii 感谢你在百忙之中回复,
然后选择第一行前面的 3 个元素,去后面 5 行查找是否存在前面三个元素相同的,有相同的+1,如第一行和第二行有相同的,则+1 (绿色条),程序向下循环查找,AAB 已经后面行已经没有,然后,(第二行,前面的 3 个元素,去后面 4 行查找是否存在前面三个元素相同的,有则+1,第三行同样,以此类推,比较存在就+1,) 到第 4 行和第 6 行也有相同的,也+1,不过这个+1 不是在第一行和第二行的前提上+1,因为它们的内部元素不相等的,然后继续循环,又回到第一行,开始取前面 4 个元素(因为之前是 3 个元素,现在元素内部也自增+1,循环一次,蓝色箭头),相互比较(查找),第 4 行和第 6 行也有相同的相同元素出现+1 (黄色条),面取前面 5 个元素,又一次循环,发现没有相同元素,程序结束。 思维是,先将字符串转换成 6 行,向竖输出,然后,第一次,先取第一行前面 3 个元素,去查找后面行前面 3 个元素是否有相同的,存在则+1,循环一次过后,再取第二行前面 3 个元素,去后面 4 行查找是否存在前面三个元素相同的,有则+1,第三行同样,以此类推,像比较存在就+1 ) 截图我也发你邮箱了,再次感谢你。 |
15
Pagliacii 2021-03-21 10:02:52 +08:00 1
@hellogitooxx #14 那就是我原来的理解才是对的,是从取 3 个元素开始各行之间作比较。但是你在 #11 又说“从第 3 个元素开始” 是指前两个元素不用管,我就改了代码不比较前两个元素了。
https://i.loli.net/2021/03/21/FZNhU1kb56RivY9.png 其实你只要改动比较字符的长度范围即可,即将 [i:i + 1] 改成 [:i + 1] |
16
hellogitooxx OP @Pagliacii 太感谢你了。刚学编程不久,能够遇到你这样热心回答,向你学习。
|
17
Pagliacii 2021-03-21 12:09:30 +08:00
@hellogitooxx #16 不客气。其实你只要把问题拆解成一个个小问题,然后把小问题一个个解决就能够解决大问题了。另外清晰地表达出问题也有助于思考
|
18
hellogitooxx OP @Pagliacii
def detect_paired(rows): paired_rows = list(combinations(rows.keys(), 2)) # 你把 paired 这个变量换成一个字典来存储比较结果就好了。 # 比如以行数组成的元组作为 key,而 value 则是相同的次数。 # 这样只要每次发现相同的两行,就把 value 加一,就可以得到你想要的结果了。 paired = {} value =1 i = 2 longest_column = max(rows.values(), key=lambda row: len(row)) while paired_rows and i < len(longest_column): for pair in paired_rows[:]: # print(pair) if rows[pair[0]][:i + 1] == rows[pair[1]][:i + 1]: # 以行数组成元组:pair #print(paired.keys()) # 你应该先判断这两行是否已经记录过了,即是否存在于 # paired 这个字典里。如果字典里已有记录,那么就更新这个记录。 # 如果没有,那么就新增一个记录到字典里去。 if pair in paired.keys(): #if pair==paired[pair]: value += 1 paired[pair]=value # 更新 elif pair not in paired.keys(): paired.update({pair: value}) print(f"L{pair[0]}==L{pair[1]}:{rows[pair[0]][:i + 1]}") else: paired_rows.remove(pair) i += 1 return paired 添加了判断行数组是否存在, 我另外换了一串字符串,如下: AAAAAABBBBBBABAABAABBBBABAAAAABABBAABBABABAAABBABAABAABDEFABBF 为什么达不到我想要的效果的,请问问题还出在哪里呢 按理说( 1,4 ),( 2,3 )不会有这么多呢? 我遇到的问题是怎么更新对应的字典里的键的值。 恳请你指点一下 |
19
Pagliacii 2021-03-21 19:54:33 +08:00 1
@hellogitooxx #18 判断一个 key 是否已存在字典里和更新字典项其实可以写成一行,如下:
paired[pair] = paired.get(pair, 0) + 1 上面这一行的代码是使用了字典的 get 方法。它的作用是如果字典里存在对应的 key,则返回它的 value 给调用方;如果不存在则返回第二个参数。 至于如何更新字典项,就是用赋值符号把值赋给对应项,如上面的 paired[pair] = ... |
20
hellogitooxx OP @Pagliacii 感谢你。
|
21
hellogitooxx OP @Pagliacii 我想问下,我还需要在哪方面进修,我对编程很感兴趣。像你回答题中,类似 defaultdict,combinations,我都没有学习到,没想到是 python 就自带的,很是惭愧。
|
22
Pagliacii 2021-03-21 21:57:38 +08:00
@hellogitooxx #21 多看看 Python 官方文档 https://docs.python.org/3/,多了解 Python 的标准库
|