如何获取 python 列表的第 n 个元素或缺省值(如果不可用)

您应该能够添加样式,如下所示(取自 Ringdroid 的源代码) :

  <style name="AudioFileInfoOverlayText">
<item name="android:paddingLeft">4px</item>
<item name="android:paddingBottom">4px</item>
<item name="android:textColor">#ffffffff</item>
<item name="android:textSize">12sp</item>
<item name="android:shadowColor">#000000</item>
<item name="android:shadowDx">1</item>
<item name="android:shadowDy">1</item>
<item name="android:shadowRadius">1</item>
</style>

在 Python 中,如何简单地为列表执行相当于 dictionary.get(key, default)的操作——即,如果不可用,如何简单地获取列表的 nth 元素或默认值?

在你的布局中,使用这样的风格:

 <TextView android:id="@+id/info"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="@style/AudioFileInfoOverlayText"
android:gravity="center" />

编辑: 源代码可以在这里查看: https://github.com/google/ringdroid

例如,给定一个 myList列表,如果 myList为空,那么如何得到 5,否则如何得到 myList[0]

328453 次浏览
l[index] if index < len(l) else default

编辑2:

为了支持负指数,我们可以使用:

l[index] if -len(l) <= index < len(l) else default
try:
a = b[n]
except IndexError:
a = default

编辑: 我删除了 TypeError 的检查-可能更好地让调用者处理这一点。

(L[n:n+1] or [somedefault])[0]
(a[n:]+[default])[0]
要通过编程方式设置这种样式,可以这样做(从 这个例子进行修改,以匹配上面的 ringdroid 资源)

TextView infoTextView = (TextView) findViewById(R.id.info);
infoTextView.setTextAppearance(getApplicationContext(),
R.style.AudioFileInfoOverlayText);

随着 a的增大,这可能会更好

(a[n:n+1]+[default])[0]

setTextAppearance的签名是

这是因为如果 a[n:]是一个空列表,如果 n => len(a)

Public void setText卖相(上下文上下文,int resid)

下面是一个使用 range(5)的示例

>>> range(5)[3:4]
[3]
>>> range(5)[4:5]
[4]
>>> range(5)[5:6]
[]
>>> range(5)[6:7]
[]

自: API 级别1

还有完整的表情

>>> (range(5)[3:4]+[999])[0]
3
>>> (range(5)[4:5]+[999])[0]
4
>>> (range(5)[5:6]+[999])[0]
999
>>> (range(5)[6:7]+[999])[0]
999

你可以同时使用代码和 XML。只需要设置4个基本的东西。

    iter(l)myList上返回一个迭代器,next()使用迭代器的第一个元素,并引发一个 StopIteration错误,除非使用默认值(这里是这种情况)调用,第二个参数 5

  1. 阴影颜色
  2. 这只在需要第一个元素时才有效,在您的示例中是这种情况,但是在您提问的文本中不是这种情况,所以..。

    此外,它不需要在内存中创建临时列表,它适用于任何类型的迭代,即使它没有名称(参见熊 Chiamiov 对 gruszczy 的回答的评论)

    HadowRadius = “0.01”
  3. 阴影 Dx-它指定 X 轴偏移的阴影。可以给出-/+ 值,其中-Dx 在文本左侧绘制阴影,+ Dx 在右侧绘制阴影
  4. 这将在文本的左下方绘制一个显著的阴影。 在代码中,您可以添加这样的内容;

        TextView item = new TextView(getApplicationContext());
    item.setText(R.string.text);
    item.setTextColor(getResources().getColor(R.color.general_text_color));
    item.setShadowLayer(0.01f, -2, 2,   getResources().getColor(R.color.text_shadow_color));
    
  • Shadow Dy-它指定了影子的 Y 轴偏移量。- Dy 指定文本上方的阴影,+ Dy 指定文本下方的阴影。
  • ... 寻找类似于巨蟒 dict.get(key, default)的列表

  • 阴影半径-指定多少阴影应该在边缘模糊。如果阴影需要突出显示,则提供一个小值。除此之外。
  • 例如:。

        android:shadowColor="@color/text_shadow_color"
    android:shadowDx="-2"
    android:shadowDy="2"
    android:shadowRadius="0.01"
    

    这将在文本的左下方绘制一个显著的阴影。 在代码中,您可以添加这样的内容;

        TextView item = new TextView(getApplicationContext());
    item.setText(R.string.text);
    item.setTextColor(getResources().getColor(R.color.general_text_color));
    item.setShadowLayer(0.01f, -2, 2,   getResources().getColor(R.color.text_shadow_color));
    

    有一个 Itertools 食谱为一般的迭代器执行此操作。为了方便起见,您可以导入 > pip install more_itertools并使用这个第三方库为您实现这些配方:

    密码

    import more_itertools as mit
    
    
    
    
    mit.nth([1, 2, 3], 0)
    # 1
    
    
    mit.nth([], 0, 5)
    # 5
    

    细节

    # tuple # 1

    以下是 nth配方的实现方法:

    def nth(iterable, n, default=None):
    "Returns the nth item or a default value"
    return next(itertools.islice(iterable, n, None), default)
    
    Nth (range (3) ,1) # range Generator (py3)

    dict.get()一样,这个工具返回缺少索引的默认值。它适用于一般的迭代器:

    mit.nth((0, 1, 2), 1)                                      # tuple
    # 1
    
    
    mit.nth(range(3), 1)                                       # range generator (py3)
    # 1
    
    
    mit.nth(iter([0, 1, 2]), 1)                                # list iterator
    # 1
    

    或者,也许更清楚,但没有 len

    my_list[index] if my_list[index:index + 1] else default
    

    如果你想得到一个像 Android 在 Launcher 中那样的阴影,我们会管理这些值。如果您想要创建将显示为小部件(没有背景)的 TextView,它们是非常有用的。

    android:shadowColor="#94000000"
    android:shadowDy="2"
    android:shadowRadius="4"
    

    使用 Python 3.4的 contextlib.suppress(exceptions)构建类似于 getattr()getitem()方法。

    import contextlib
    
    
    def getitem(iterable, index, default=None):
    """Return iterable[index] or default if IndexError is raised."""
    with contextlib.suppress(IndexError):
    return iterable[index]
    return default
    
    (IndexError) :

    一个便宜的解决方案是真正使用枚举和使用 .get()一样,像

     dict(enumerate(l)).get(7, my_default)
    
    返回迭代[索引]

    在阅读完答案后,我将使用:

    (L[n:] or [somedefault])[0]
    

    输出:

    enter image description here

    您需要将当前查询放在子查询中,如下所示:

    SELECT * FROM (
    SELECT DISTINCT
    APP_ID,
    NAME,
    STORAGE_GB,
    HISTORY_CREATED,
    TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE
    FROM HISTORY WHERE
    STORAGE_GB IS NOT NULL AND
    APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009')
    ORDER BY STORAGE_GB DESC )
    WHERE ROWNUM <= 10
    

    对于一个小的索引,比如解析到 k参数时,我将构建一个长度为 k的新列表,并将添加的元素设置为 d,如下所示:

    def fill(l, k, d):
    return l + (k - len(l)) * [d]
    

    典型用法:

    N = 2
    arg_one, arg_two = fill("first_word and the rest".split(maxsplit=N - 1), N, None)
    # arg_one == "first_word"
    # arg_two == "and the rest"
    
    
    

    同样的例子,有一个简短的列表:

    arg_one, arg_two = fill("one_word_only".split(maxsplit=N - 1), N, None)
    # arg_one == "one_word_only"
    # arg_two == None
    
    
    

    打开行李:

    b, = a[n:n+1] or [default]