1
Lax 2019-05-02 12:36:44 +08:00
到底要第一个 index 还是最后一个 index ?
去掉第一个元素,然后对应位置相减试试: [1,2,3,3,3,9,9,9] [2,3,3,3,9,9,9] |
2
noqwerty 2019-05-02 12:45:26 +08:00 via Android
笨方法就是建两个列表 obs_num 和 obs_count,前者是观测到的数字,后者是这个数字连续出现的次数,然后输出 obs_count 最大时 obs_num 的最大值。
|
3
whusnoopy 2019-05-02 12:45:29 +08:00
完全没看懂你的问题是什么,我猜要求是
1. 连续次数最多的数在连续最多次那一段的第一个数的下标 2. 在 1 的基础上,如果有多个数字出现了相同的最多连续次数,选最大的那个数符合 1 的输出 3. 在 2 的基础上,如果有多个相同数字出现了最多连续次数且都是最大,选第一次连续段符合 1 的输出 如果是我的这个猜测,那么 ```python # coding: utf8 list1 = [1, 2, 3, 3, 3, 9, 9, 9] list2 = [1, 9, 9, 3, 2, 9, 9, 9] def first_index(input_list): fi = [0, 0, -1] # 已知符合条件的数字,最大连续次数,首次下标 curr = [None, 0, -1] for idx, num in enumerate(input_list): if num != curr[0]: curr = [num, 1, idx] else: curr[1] += 1 if curr[1] > fi[1]: fi[0] = curr[0] fi[1] = curr[1] fi[2] = curr[2] elif curr[1] == fi[1]: if curr[0] > fi[0]: fi[0] = curr[0] fi[1] = curr[1] fi[2] = curr[2] return fi[2] print first_index(list1) print first_index(list2) ``` |
4
oneTimeElastic OP 是要一组连续数的第一个数的 index
能讲讲什么叫对应位置相减吗 |
5
oneTimeElastic OP @whusnoopy 嗯就是这个要求 真是惭愧,语文表达都成问题
这个办法很好,我一开始用 dictionary 记录 index 和次数,但没用 enumerate 而使用 while i < len(ls) 然后再遇到重复 i += 1 这样的,结果遇到了超了 list 的 index 哎 |
6
Northxw 2019-05-03 12:12:43 +08:00
这应该是道算法题(不知道是不是 leetcode 上面的....)
|
7
necomancer 2019-05-05 01:02:59 +08:00
l = [1,2,3,3,3,9,9,9]
l = [1,9,9,9,3,2,9,9,9] counts = [[1,0,l[0]]] i = 0 for idx, item in enumerate(zip(l[:-1], l[1:])): prev, nxt = item if prev == nxt: counts[i][0] += 1 else: counts.append([1,nxt,idx+1]) i += 1 print(counts, l) print(sorted(counts, key=lambda x:(x[0],x[1],-x[2]), reverse=True)[0]) # 按出现次数、元素本身大小和元素序号(逆序)排序 print(sorted(counts, key=lambda x:(x[0],x[1],-x[2]), reverse=True)[0]) # 按出现次数、元素本身大小和元素序号排序 |
8
necomancer 2019-05-05 01:03:44 +08:00
输出:
[[1, 0, 1], [3, 9, 1], [1, 3, 4], [1, 2, 5], [3, 9, 6]] [1, 9, 9, 9, 3, 2, 9, 9, 9] [3, 9, 1] [3, 9, 6 |