- (void)changeScopeBarColor {
NSMutableArray<UIView*> *views = [NSMutableArray new];
NSArray<UIView *> *subviews = [_searchBar subviews];
[views addObjectsFromArray:subviews];
for (;;) {
if (views.count == 0) {
break;
}
UIView *v = [views firstObject];
[views removeObject:v];
if ([[[v class] description] isEqualToString:@"_UISearchBarScopeBarBackground"]) {
v.backgroundColor = [UIColor whiteColor];
break;
}
if (v.subviews.count > 0)
[views addObjectsFromArray:v.subviews];
}
}
Как я уже упоминал в комментарии, я использовал словарь для решения этой проблемы.
Здесь вам не нужно беспокоиться о создании пустого списка с помощью какой-либо внешней функции, так как мы не знаем фактическую длину.
Так что вы можете попробовать вот так.
Вы можете посетить https://rextester.com/ZQKA28350 , чтобы запустить код онлайн.
blockquote>def add_words_to_bucket(words): d = {} for word in words: l = len(word) if l in d: d[l].append(word) else: i = 0 while l >= 0 and not l in d: if not i: d[l] = [word] else: d[l] = [] l = l - 1 i += 1 return d def get_as_list(d): bucket = [d[i] for i in range(0, len(d))] return bucket words = ["a", "git", "go", "py", "java", "paper", "ruby", "r"] d = add_words_to_bucket(words) bucket = get_as_list(d) print(d) # {0: [], 1: ['a', 'r'], 2: ['go', 'py'], 3: ['git'], 4: ['java', 'ruby'], 5: ['paper']} print(bucket) # [[], ['a', 'r'], ['go', 'py'], ['git'], ['java', 'ruby'], ['paper']] words2 = ["a", "git", "go", "py", "", "java", "paper", "ruby", "r","TheIpMan", ""] d2 = add_words_to_bucket(words2) bucket2 = get_as_list(d2) print(d2) # {0: ['', ''], 1: ['a', 'r'], 2: ['go', 'py'], 3: ['git'], 4: ['java', 'ruby'], 5: ['paper'], 6: [], 7: [], 8: ['TheIpMan']} print(bucket2) # [['', ''], ['a', 'r'], ['go', 'py'], ['git'], ['java', 'ruby'], ['paper'], [], [], ['TheIpMan']]
Вы можете получить самое длинное слово в списке слов с помощью max()
и снабдить ключевую функцию len
.
Вы можете создать еще один блок для «пустых» слов и отсортировать все ваши слова в сегменты, используя цикл for и индексируя в свои сегменты с помощью len(word)
:
# create some demo strings and add some other words
words = [ str(10**k) for k in range(10)]
words.extend(["this","should","work","out","somehow"])
print(words) # ['1', '10', '100', '1000', '10000', '100000', '1000000', '10000000',
# '100000000', '1000000000', 'this', 'should', 'work', 'out', 'somehow']
longest = len(max(words,key=len)) # get the length of the longest word
# create a empty bucket for "" and one bucket for length 1 up to longest
bins = [None] + [ [] for _ in range(longest+1)]
# loop over words and put then in the bin at index len(word)
for w in words:
bins[len(w)].append(w)
print(bins)
Вывод:
[None, ['1'], ['10'], ['100', 'out'], ['1000', 'this', 'work'], ['10000'],
['100000', 'should'], ['1000000', 'somehow'], ['10000000'],
['100000000'], ['1000000000']]
Доку:
buckets = [0] * longest # this will make a list of longest size
Затем создайте список в каждом элементе, и я использую первый элемент списка, чтобы вести подсчет этого сегмента.
for i in range(longest):
buckets[i] = [0]
Затем вам нужно добавить слова в ведра.
for L in words:
buckets[len(L)][0] += 1 # increasing the count of that bucket
buckets[len(L)].append(L) # Adding the word to that bucket
Вот пример:
longest = 10
words = ['this', 'that', 'foremost']
buckets = [0] * longest # this will make a list of longest size
for i in range(longest):
buckets[i] = [0]
for L in words:
buckets[len(L)][0] += 1 # increasing the count of that bucket
buckets[len(L)].append(L) # Adding the word to that bucket
Чтобы получить доступ к любому из подсчетов, это просто buckets[number][0]
и для доступа ко всем словам, вы цикл, начинающийся с buckets[number][1]
.