Python使用set的最快搜索算法

时间:2017-09-24 08:21:08

标签: python

我找到了搜索列表中项目的最快方法。正如我在Python中发现的那样,最好使用 @Override protected final void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tabSwitcher = (TabSwitcher) findViewById(R.id.tab_switcher); ViewCompat.setOnApplyWindowInsetsListener(tabSwitcher, createWindowInsetsListener()); tabSwitcher.setDecorator(new Decorator()); tabSwitcher.addListener(this); tabSwitcher.showToolbars(true); tabSwitcher .setToolbarNavigationIcon(R.drawable.ic_add_box_white_24dp, createAddTabListener()); tabSwitcher.inflateToolbarMenu(R.menu.tab_switcher, createToolbarMenuListener()); tabSwitcher.getViewTreeObserver() .addOnGlobalLayoutListener(createTabSwitcherLayoutListener()); for (int i = 0; i < TAB_COUNT; i++) { tabSwitcher.addTab(createTab(i)); } } @NonNull private Tab createTab(final int index) { CharSequence title = getString(R.string.tab_title, index + 1); Tab tab = new Tab(title); Bundle parameters = new Bundle(); parameters.putInt(VIEW_TYPE_EXTRA, index); tab.setParameters(parameters); return tab; } private class Decorator extends TabSwitcherDecorator { @NonNull @Override public View onInflateView(@NonNull final LayoutInflater inflater, @Nullable final ViewGroup parent, final int viewType) { View view; view = inflater.inflate(R.layout.tab_edit_text, parent, false); Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); toolbar.inflateMenu(R.menu.tab); toolbar.setOnMenuItemClickListener(createToolbarMenuListener()); Menu menu = toolbar.getMenu(); TabSwitcher.setupWithMenu(tabSwitcher, menu, createTabSwitcherButtonListener()); return view; } @Override public void onShowTab(@NonNull final Context context, @NonNull final TabSwitcher tabSwitcher, @NonNull final View view, @NonNull final Tab tab, final int index, final int viewType, @Nullable final Bundle savedInstanceState) { TextView textView = findViewById(android.R.id.title); textView.setText(tab.getTitle()); Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setVisibility(tabSwitcher.isSwitcherShown() ? View.GONE : View.VISIBLE); Button bnt = findViewById(R.id.button1); if (viewType != 0) { EditText editText = findViewById(android.R.id.edit); editText.requestFocus(); } EditText editText = findViewById(android.R.id.edit); if(TextUtils.isEmpty(editText.getText())) { bnt.setOnClickListener(new View.OnClickListener() { WebView web1; EditText editText = findViewById(android.R.id.edit); public void onClick(final View view) { String Address = "https://www.google.com/search?q=" + editText.getText().toString(); web1 = (WebView) findViewById(R.id.webview); WebSettings webSetting = web1.getSettings(); webSetting.setBuiltInZoomControls(true); webSetting.setJavaScriptEnabled(true); web1.setWebViewClient(new WebViewClient()); web1.loadUrl(Address); } }); }else{ WebView web1; ; web1 = (WebView) findViewById(R.id.webview); String webUrl = web1.getUrl(); editText.setText(webUrl); WebSettings webSetting = web1.getSettings(); webSetting.setBuiltInZoomControls(true); webSetting.setJavaScriptEnabled(true); web1.setWebViewClient(new WebViewClient()); web1.loadUrl(webUrl); } } public class WebViewClient extends android.webkit.WebViewClient { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { // TODO Auto-generated method stub super.onPageStarted(view, url, favicon); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub view.loadUrl(url); EditText editText = (EditText) findViewById(android.R.id.edit); editText.setText(url); return true; } @Override public void onPageFinished(WebView view, String url) { // TODO Auto-generated method stub super.onPageFinished(view, url); } } 来搜索项而不是使用set。所以我将list替换为list。但是,set中的所有项都是对象。我想搜索是否有对象id等于我想要找到的id。如果是,则返回该对象。

我可以在一个简单的for循环中完成它,但我不知道如果我仍然循环所有元素来找到该项,它如何在set中得到改进。

set

2 个答案:

答案 0 :(得分:1)

使用 python的设置,您可以在其中分配 ID

d = { id, id2, id3, .. idN }

然后您可以简单地声明if id in d来验证元素是否在集合中(不重复它)。 这个工作的原因是因为python中的Set实现像dict没有值(哈希表)。这为您提供了 O(1)的会员资格检查。

s = set([1, 2, 3, 4, 5])

if 1 in s:
    print 'in!'  # in! is printed

从此answer拍摄(感谢 @ juanpa.arrivillaga

  

CPython的集合实现为具有虚拟值的字典(键是集合的成员),以及利用这种缺乏值的一些优化

或者,另一种选择是使用已排序的集合。 (使用Set无法完成此操作,因此要么实现SortedSet类,要么使用list对象)

一种快速搜索算法是二进制搜索。 (bisect module

您可以在>之后使用此算法对系列进行排序。

答案 1 :(得分:1)

下面总结了如何使用python dictionary作为示例。

def find(allItems, id):
  return allItems[id]

def addItem(allItems, item):
  allItems[item['id']] = item

# create a python dictionary called `allItems`
allItems = {}

# add some items to the dictionary
item1 = { 'id': 1, 'name': 'James' }
item2 = { 'id': 2, 'name': 'Susan' }
addItem(allItems, item1)
addItem(allItems, item2)

# now lookup an item by its id
result = find(allItems, 1)
print result['name']  # ==> 'James'

作为文档explains,当您想要按其ID 查找项时,词典很好。

  

与由一系列数字索引的序列不同,词典由键索引 ...字典上的主要操作是存储带有某个键的值并提取给定键的值

这意味着如果您知道项目的“密钥” - 即项目的ID,您可以立即找到该项目。无需使用for循环。