Присвоение нулевому значению нулевому перечислению через:? оператор [дубликат]

Вы можете использовать itertools.chain() :

>>> import itertools
>>> list2d = [[1,2,3],[4,5,6], [7], [8,9]]
>>> merged = list(itertools.chain(*list2d))

или, на Python> = 2.6, использовать itertools.chain.from_iterable() , который не требуется распаковать список:

>>> import itertools
>>> list2d = [[1,2,3],[4,5,6], [7], [8,9]]
>>> merged = list(itertools.chain.from_iterable(list2d))

Этот подход, возможно, более читабельен, чем [item for sublist in l for item in sublist], и, похоже, работает быстрее:

[me@home]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99;import itertools' 'list(itertools.chain.from_iterable(l))'
10000 loops, best of 3: 24.2 usec per loop
[me@home]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' '[item for sublist in l for item in sublist]'
10000 loops, best of 3: 45.2 usec per loop
[me@home]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'sum(l, [])'
1000 loops, best of 3: 488 usec per loop
[me@home]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'reduce(lambda x,y: x+y,l)'
1000 loops, best of 3: 522 usec per loop
[me@home]$ python --version
Python 2.7.3

50
задан CodesInChaos 21 April 2012 в 18:46
поделиться

5 ответов

Проблема возникает из-за того, что условный оператор не смотрит, как это значение используется (назначается в этом случае), чтобы определить тип выражения - только значения true / false. В этом случае у вас есть null и Int32, и тип не может быть определен (есть реальные причины, по которым он не может просто принять Nullable & lt; Int32 & gt;).

Если вы действительно хотите использовать его таким образом, вы должны указать одно из значений в Nullable & lt; Int32 & gt; самостоятельно, поэтому C # может разрешить тип:

EmployeeNumber =
    string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? (int?)null
    : Convert.ToInt32(employeeNumberTextBox.Text),

или

EmployeeNumber =
    string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? null
    : (int?)Convert.ToInt32(employeeNumberTextBox.Text),
63
ответ дан Alex Lyman 23 August 2018 в 21:00
поделиться

Вы можете вывести вывод Convert:

EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text)
   ? null
   : (int?)Convert.ToInt32(employeeNumberTextBox.Text)
3
ответ дан Abe Heidebrecht 23 August 2018 в 21:00
поделиться
//Some operation to populate Posid.I am not interested in zero or null
int? Posid = SvcClient.GetHolidayCount(xDateFrom.Value.Date,xDateTo.Value.Date).Response;
var x1 = (Posid.HasValue && Posid.Value > 0) ? (int?)Posid.Value : null;

EDIT: Краткое объяснение выше, я пытался получить значение Posid (если его nonnull int и имеющий значение больше 0) в varibale X1. Я должен был использовать (int?) на Posid.Value, чтобы оператор условности не выдавал ошибку компиляции. Просто FYI GetHolidayCount - это метод WCF, который может дать null или любое число. Надеюсь, что это поможет

1
ответ дан Irshad 23 August 2018 в 21:00
поделиться

Я думаю, что полезный метод мог бы помочь сделать этот чист.

public static class Convert
{
    public static T? To<T>(string value, Converter<string, T> converter) where T: struct
    {
        return string.IsNullOrEmpty(value) ? null : (T?)converter(value);
    }
}

, затем

EmployeeNumber = Convert.To<int>(employeeNumberTextBox.Text, Int32.Parse);
8
ответ дан NerdFury 23 August 2018 в 21:00
поделиться

Хотя Алекс дает правильный и проксимальный ответ на ваш вопрос, я предпочитаю использовать TryParse:

int value;
int? EmployeeNumber = int.TryParse(employeeNumberTextBox.Text, out value)
    ? (int?)value
    : null;

. Он безопаснее и заботится о случаях недействительного ввода, а также о пустом строковом сценарии , В противном случае, если пользователь вводит что-то вроде 1b, им будет представлена ​​страница с ошибкой с необработанным исключением, вызванным в Convert.ToInt32(string).

6
ответ дан Rory McCrossan 23 August 2018 в 21:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: